尝试使用递归构建列表。全局列表中的值不会更改

时间:2013-12-21 07:04:53

标签: python list python-2.7 recursion scope

所以我遇到了问题,我使用递归解决方案。为简单起见,让我们说问题是我需要找到给定字符串的所有字符。 (这个问题很复杂,但这足以说明我在做什么)。

我正在使用递归来做到这一点。

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列表,或者将列表作为参数传递,因为被调用者对列表所做的任何更改也应该反映在调用者中。但没有任何效果。

为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:3)

实际问题在于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-satisf建议的那样,请避免使用全局变量并将all_anagrams作为参数之一传递。