【问题标题】:Python list append different lists in the same scope for the same variablePython list 在同一范围内为同一变量附加不同的列表
【发布时间】:2019-10-16 09:30:33
【问题描述】:

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

代码是堆的算法。我在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)

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 2021-08-19
      • 2018-02-15
      • 1970-01-01
      • 2022-11-14
      • 2021-06-23
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多