Python列表将相同范围内的不同列表附加到同一变量中

时间:2019-05-30 17:41:09

标签: list arguments pass-by-reference python-3.5

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

代码是堆的算法。 size == 1时我完成了排列。因此,a可以将置换后的列表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的打印排列都是正确的。但是追加到我的global res的列表V并没有改变。它们在打印后立即添加,并且列表添加不同。

如果您更改这样的行:

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

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

1 个答案:

答案 0 :(得分:1)

res.append(V)代替res.append(list(V))可以解决您的问题。

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

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