Python 列表推导式:创建二维数组
可能重复的问题:
在修改Python二维列表中的单个值时出现奇怪的行为
大家好,
我想知道下面这两个语句是不是一样的?
a = [[0]*3]*3
b = [[0]*3 for i in range(3)]
结果看起来是一样的。但是,有一种写法会比另一种更好吗?这里有什么区别呢?
非常感谢你的帮助。
nos
3 个回答
0
这是一个经典的浅拷贝和深拷贝的例子,详细解释可以在这里的Python文档中找到 :)
7
不,它们不是一样的。
在第一个例子中,你有三个完全相同的列表,它们指向的是同一个地方;而在第二个例子中,你有三个不同的列表。
>>> 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]]
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]]
第一个是创建了一个外部数组,这个数组里面存的是指向一个内部数组的指针;而第二个则是实际创建了三个独立的数组。