我尝试通过在生成每个排列时附加全局列表来生成排列列表(也列表)。我可以通过在生成之后打印每个排列来正确生成排列。但是,在调用函数之后,我的全局列表仅包含每次函数生成排列时的原始列表。
array = []
def perms(a, k):
if (k == len(a)):
global array
array.append(a)
print(a) #perms function is working properly
else:
for i in range(k, len(a)):
a[k], a[i] = a[i], a[k]
perms(a, k+1)
a[k], a[i] = a[i], a[k]
perms([1,2,3,4], 0)
#only prints the original list for each time a perm was generated
for i in array: print(i)
当我在底部打印时,它显示数组= [[1,2,3,4],[1,2,3,4],...]
似乎我的全局列表数组只能在调用它的范围内看到perms参数。
如何正确完成?
答案 0 :(得分:0)
在Python中,列表是可变的。因此,当您在perms(a, k+1)
内拨打perms
时,您将在递归调用中以a
的完全相同的实例结束。考虑这个例子:
>>> a = []
>>> b = [4,5,6]
>>> a.append(b)
>>> print a
[[4, 5, 6]]
>>> b.append(7)
>>> print a
[[4, 5, 6, 7]]
如您所见,直接编辑b
列表也会编辑附加到b
列表的a
,因为b
和a[0]
正在引用完全相同的对象:
>>> b is a[0]
True
您不会看到带有字符串的行为,这些字符串是不可变的:
>>> a = []
>>> b = "hi"
>>> a.append(b)
>>> print a
['hi']
>>> b = "blah"
>>> print a
['hi']
>>> b is a[0]
False
您可以通过将a
列表的副本传递给递归调用来解决代码中的问题,如下所示:
perms(a[:], k+1)