python 列表理解:创建二维数组[重复]

问题描述 投票:0回答:3

这两个表达方式一样吗?

a = [[0]*3]*3
b = [[0]*3 for i in range(3)]

生成的

a
b
值看起来相同。但其中一种方式会比另一种更好吗?这里有什么区别。

python list-comprehension
3个回答
18
投票

它们不一样

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


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

0
投票

这是浅复制与深复制的经典案例,如Python文档中here所解释:)

© www.soinside.com 2019 - 2024. All rights reserved.