Python list 在同一范围内为同一变量追加不同的列表

Python list append different lists in the same scope for the same variable

好的。我编写了一个算法来显示整数列表的所有排列。但是在算法过程中,我在将置换列表附加到结果列表时遇到了问题。

代码是堆的算法。我在 size == 1 时完成了排列。因此,可以将置换列表 V 附加到我的最终列表 res。这是代码:

排列列表的函数

def permutations(V, size):
    global res

    if size == 1:
        print(V)
        res.append(V)

    for i in range(0, size):
        permutations(V, size-1)

        if size % 2 == 1:
            V[size-1], V[0] = V[0], V[size-1]
        else:
            V[i], V[size-1] = V[size-1], V[i]

A = [1,2,3]
res = []
permutation(A, len(A))
print(res)

这是输出:

[1, 2, 3]
[2, 1, 3]
[3, 1, 2]
[1, 3, 2]
[2, 3, 1]
[3, 2, 1]
res: [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

V 的打印排列都是正确的。但是列表 V 附加到我的 global res 没有改变。它们在打印后立即追加,列表追加不同。

如果像这样更改行:

res.append(V)
  |
  |
  v      
D = [V[i] for i in range(len(V))]
res.append(D)

决赛的结果是正确的。任何人都可以解释打印列表与使用相同变量的附加列表有何不同。

res.append(V) 替换为 res.append(list(V)) 即可解决您的问题。

您附加到 res 的所有 V 都是对同一对象的引用。这可以通过打印列表中每个元素的 id 来观察:

for i in res:
    print(id(i))