可能重复:
Python 2D list has weird behavor when trying to modify a single value
人,
我想知道以下两个陈述是否相同?
a = [[0]*3]*3
b = [[0]*3 for i in range(3)]
结果看起来一样。但是一种方式会比另一种更好吗?这有什么区别。
非常感谢你的帮助。
号
答案 0 :(得分:17)
他们不一样
>>> a[1][2] = 5
>>> a
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]]
>>> b[1][2] = 5
>>> b
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]]
第一个创建指向单个内部数组的外部指针数组,而第二个实际创建3个单独的数组。
答案 1 :(得分:7)
不,他们不是。
在第一个你有(一个列表)3个相同的列表,相同的参考,在第二个你有三个不同的列表
>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
>>> b = [[0]*3 for i in range(3)]
>>> b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> b[0][0] = 1
>>> b
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
答案 2 :(得分:0)
这是浅拷贝与深拷贝的经典案例,如Python文档中的here所述:)