所以我遇到了问题,我使用递归解决方案。为简单起见,让我们说问题是我需要找到给定字符串的所有字符。 (这个问题很复杂,但这足以说明我在做什么)。
我正在使用递归来做到这一点。
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
列表,或者将列表作为参数传递,因为被调用者对列表所做的任何更改也应该反映在调用者中。但没有任何效果。
为什么会这样?我该如何解决?
答案 0 :(得分:3)
实际问题在于append
和pop
。当你这样做
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
作为参数之一传递。