python列表理解:创建2d数组

python列表理解:创建2d数组,python,list-comprehension,Python,List Comprehension,可能重复: 各位 我想知道以下两种说法是否相同 a = [[0]*3]*3 b = [[0]*3 for i in range(3)] 结果看起来是一样的。但是一种方法会比另一种更好吗?这里有什么区别 非常感谢你的帮助 不,他们不是。 在第一个列表中,你有三个相同的列表,相同的引用,在第二个列表中,你有三个不同的列表 >>> a = [[0]*3]*3 >>> a [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>>

可能重复:

各位

我想知道以下两种说法是否相同

a = [[0]*3]*3
b = [[0]*3 for i in range(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]]
他们不一样

>>> 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个独立的数组。

这是浅拷贝与深拷贝的经典案例,正如Python文档中所解释的:)

有成千上万个问题涉及到这个确切的主题…+1。请尝试
a[0]。追加(“foo”)
。我键入的内容与此完全相同+是的,在第一个数组中,所有三个数组都是同一个对象。如果您使用整数,例如[1]*5而不是[[]]*5,则在每个位置使用一个新的整数。这些不是python数组…这些是python列表。