首页 > 解决方案 > python:分配并读出二维列表的值

问题描述

这是一段python代码:

a = [[0]*3]*4
for i in range(4):
    for j in range(3):
        a[i][j] = i+j
        print(a[i][j])
print(a)

但是,两个打印的输出是不同的。

前一个打印我想要的。第二个打印的 4 个子列表都一样。

看来是浅拷贝的问题。我真的不明白它是如何以及为什么会发生的。

更新:

在我解决了这个问题之后,我发现了另一个问题:

a = [[0]*3]*4
for i in range(4):
    a[i] = [i, 2*i, 3*i]

结果也是我想要的。我再次对此感到困惑。

谁能告诉我区别?

标签: python

解决方案


a = [[0]*3]*4
for i in range(4):
    for j in range(3):
        a[i][j] = i+j
        print(a)
        print(a[i][j])//show the execution at every step
print(a)

在每一步,具有相同列的列表都会更新为相同的值。输出是

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
0
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
1
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
2
[[1, 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]
1
[[1, 2, 2], [1, 2, 2], [1, 2, 2], [1, 2, 2]]
2
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
3
[[2, 2, 3], [2, 2, 3], [2, 2, 3], [2, 2, 3]]
2
[[2, 3, 3], [2, 3, 3], [2, 3, 3], [2, 3, 3]]
3
[[2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4]]
4
[[3, 3, 4], [3, 3, 4], [3, 3, 4], [3, 3, 4]]
3
[[3, 4, 4], [3, 4, 4], [3, 4, 4], [3, 4, 4]]
4
[[3, 4, 5], [3, 4, 5], [3, 4, 5], [3, 4, 5]]
5
[[3, 4, 5], [3, 4, 5], [3, 4, 5], [3, 4, 5]]

推荐阅读