簡體   English   中英

嘗試使用遞歸構建列表。 全局列表中的值不變

[英]Trying to build a list using recursion. Value in global list doesn't change

所以我在做一個問題,並且我使用了遞歸解決方案。 為簡單起見,假設問題是我需要查找給定字符串的所有字謎。 (問題很復雜,但這足以說明我在做什么)。

我正在使用遞歸來做到這一點。

all_anagrams = []

def main():
    ...
    ...
    get_anagrams() # calls a method that appends anagrams to list all_anagrams
    print all_anagrams

方法get_anagrams是:

def get_anagrams(user_word, anagram, words, inventory):
'''
Finds all anagrams for the given user_word.
'''
    if len(inventory) == 0:
        all_anagrams.append(anagram)
    else:
        for choice in words:
                if len(choice) <= len(inventory) and choice in inventory:
                anagram.append(choice)
                inventory.subtract(choice)
                get_anagrams(user_word, anagram, words, inventory)
                    anagram.pop()
                    inventory.add(choice)

all_anagrams應該是一個嵌套列表,其中每個子列表都由一些單詞組成。

現在get_anagrams應該改變的全球價值all_anagrams但事實並非如此。 main ,它打印[[], [], [], [], [], []] ,但是在方法內,它打印正確的列表。

請考慮以下示例:

>>> a_list = []
>>> def change_list(some_list):
...     some_list.append(1)
...     some_list.append(2)
...     
>>> 
>>> change_list(a_list)
>>> a_list
[1, 2]

我嘗試將列表定義為global列表,或者將列表作為參數傳遞,因為被調用方對列表所做的任何更改也應反映在調用方中。 但是沒有任何效果。

為什么會這樣呢? 我如何解決它?

實際的問題是appendpop 當你做

all_anagrams.append(anagram)

您正在將對anagram的引用添加到all_anagrams 但是,當遞歸展開時,您將從anagram中彈出值。 這就是為什么在main中打印空列表的原因。 立即修復將是這樣

            if len(choice) <= len(inventory) and choice in inventory:
            inventory.subtract(choice)
            get_anagrams(user_word, anagram + [choice], words, inventory)
            inventory.add(choice)

正如e-satis所建議的,請避免使用全局變量,而將all_anagrams作為參數之一傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM