Python列表乘法:[[...]]*3会生成3个可互相影响的列表

46 投票
4 回答
38267 浏览
提问于 2025-04-16 21:29

为什么会发生这种情况呢?我不是很明白:

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

撰写回答