可能重复: Python列表中的意外特性
我想用Python列出一个列表,但显然这是行不通的,因为更改一个数字会改变几个。为什么会这样,我该怎么解决呢?
>>> a = [[0]*3]*4
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]发布于 2012-10-21 02:07:31
你发现的是一个经典Python陷阱。
x = [0]*3是一个列表。没有问题,但是[x]*4创建了一个列表,其中包含了对完全相同的列表x的4个引用。因此,修改第一个元素,x,也会修改其他元素。
相反,如果您这样做:
In [193]: a = [[0]*3 for i in range(4)]然后在列表中得到4个不同的项目:
In [194]: a[0][0] = 1
In [195]: a
Out[195]: [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]发布于 2012-10-21 02:12:04
在Python中,[x]*n创建一个新列表,其中包含对x的n引用。如果x是不可变的(字符串、元组等),这是非常好的,但是如果x是可变的,则会变得相当混乱,因为对一个元素的更改会影响x,因此似乎会影响列表中的所有元素。
因此,解决方案是使用列表理解来创建n新事物:
[x for _ in xrange(n)] # we use _ here as a "dummy variable"在你的例子中,看起来就像
a = [[0]*3 for _ in xrange(4)]发布于 2012-10-21 02:08:25
不要使用*。使用列表理解并创建如下所示:
>>> a = [[0 for i in range(3)] for j in range(4)]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]更好的解释见unutbu和nneonneo的答案。
https://stackoverflow.com/questions/12994303
复制相似问题