将列表附加到python中的全局列表

时间:2014-06-06 02:55:05

标签: python python-3.x global-variables

我尝试通过在生成每个排列时附加全局列表来生成排列列表(也列表)。我可以通过在生成之后打印每个排列来正确生成排列。但是,在调用函数之后,我的全局列表仅包含每次函数生成排列时的原始列表。

    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参数。

如何正确完成?

1 个答案:

答案 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,因为ba[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)