python:分配并读取二维列表的值

python:分配并读取二维列表的值,python,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 ra

下面是一段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]
结果也是我想要的。我再一次对此感到困惑


谁能告诉我这两者的区别呢?

运算符获取列表和int的乘法器将生成列表元素的浅拷贝,因此您的思路是正确的

改为这样初始化

a = [[0] * 3 for _ in range(4)]
在每个步骤中,具有相同列的列表都会更新为相同的值。 输出为

[[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]]

谢谢我已经从前面的一个问题中弄明白了为什么会发生这种情况。您的回答是正确的,但是,我不知道为什么显示的post分数为负。原因是“*4”只对现有子列表[[0]*3]进行了3次引用,而没有创建新的子列表。因此,本质上它只在这里创建一个子列表。
[[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]]