在Python中将列表附加到全局列表
我正在尝试生成一个排列的列表(也就是一些列表),方法是每次生成排列时都把一个全局列表添加进去。我可以通过在每次生成后打印出来来确认排列生成得很正确。不过,在函数调用之后,我的全局列表每次只包含原始列表。
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)
当我在最后打印的时候,它显示的内容是 array = [[1,2,3,4], [1,2,3,4], ...]
看起来我的全局列表 array 只能在调用它的那个范围内看到 perms 参数 a。
那么,正确的做法应该是什么呢?
1 个回答
0
在Python中,列表是可变的。这意味着当你在函数perms
里面调用perms(a, k+1)
时,其实你是在使用同一个a
的实例。来看这个例子:
>>> a = []
>>> b = [4,5,6]
>>> a.append(b)
>>> print a
[[4, 5, 6]]
>>> b.append(7)
>>> print a
[[4, 5, 6, 7]]
你会发现,直接修改b
列表也会影响到已经添加到a
列表中的b
,因为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)