在Python中将列表附加到全局列表

2 投票
1 回答
2018 浏览
提问于 2025-04-18 08:49

我正在尝试生成一个排列的列表(也就是一些列表),方法是每次生成排列时都把一个全局列表添加进去。我可以通过在每次生成后打印出来来确认排列生成得很正确。不过,在函数调用之后,我的全局列表每次只包含原始列表。

    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,因为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)

撰写回答