python list comprehension:创建2d数组

nos*_*nos 9 python list-comprehension

可能重复:
Python 2D列表在尝试修改单个值时具有奇怪的行为

乡亲,

我想知道以下两个陈述是否相同?

a = [[0]*3]*3
b = [[0]*3 for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

结果看起来一样.但是一种方式会比另一种更好吗?这有什么区别.

非常感谢您的帮助.

Cha*_* Ma 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]]
Run Code Online (Sandbox Code Playgroud)

第一个创建指向单个内部数组的外部指针数组,而第二个实际创建3个单独的数组.

  • 这些不是python数组......这些是python列表. (3认同)

joa*_*uin 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]]
Run Code Online (Sandbox Code Playgroud)