Python列表乘法:[[...]]*3会生成3个可互相影响的列表
为什么会发生这种情况呢?我不是很明白:
>>> P = [ [()]*3 ]*3
>>> P
[[(), (), ()], [(), (), ()], [(), (), ()]]
>>> P[0][0]=1
>>> P
[[1, (), ()], [1, (), ()], [1, (), ()]]
4 个回答
6
其实,这里是同一个内部列表(同一个引用)被复制了三次,所以当你修改其中任何一个时,实际上你是在修改所有的那个列表。
所以,内部列表 [()]*3
生成了一个包含三个元组的列表。但接下来,这个列表又被复制了三次。不过,在Python中,实际上是引用的列表被重复了,所以引用被复制了,但每个引用仍然指向同一个底层列表。
8
列表是可以改变的,也就是说你可以随意修改它们。而把一个列表乘以一个数字并不会复制它里面的元素。你可以试着把它改成列表推导式,这样它会计算 [()]*3
三次,生成三个不同的列表:
P = [ [()]*3 for i in range(3) ]
37
你对同一个列表提到了3次。
>>> a = b = []
>>> a.append(42)
>>> b
[42]
你想要这样做:
P = [[()] * 3 for x in range(3)]