Python列表乘法:] * 3使3个列表相互镜像时修改

为什么发生这种情况? 我真的不明白:

>>> P = [ [()]*3 ]*3 >>> P [[(), (), ()], [(), (), ()], [(), (), ()]] >>> P[0][0]=1 >>> P [[1, (), ()], [1, (), ()], [1, (), ()]] 

你已经对同一个列表做了3个引用。

 >>> a = b = [] >>> a.append(42) >>> b [42] 

你想这样做:

 P = [[()] * 3 for x in range(3)] 

列表是可变的,列表乘以数字不会复制其元素。 您可以尝试将其更改为列表理解,因此它会评估[()]*3三次,创build三个不同的列表:

 P = [ [()]*3 for i in range(3) ] 

它实际上是相同的内部列表(相同的参考),重复3次,所以当你修改其中任何一个,你实际上是修改所有这些。

所以,内部列表[()]*3产生一个三元组列表。 但是这个列表重复了三次。 然而,在python中,它实际上是一个被相乘的引用列表,所以引用是重复的,但是每个引用仍然指向相同的基础列表。

你也可以这样写,它具有显示结构[[()]*3]*3的优点

 >>> P=[i[:] for i in [[()]*3]*3] >>> P[0][0]=1 >>> P [[1, (), ()], [(), (), ()], [(), (), ()] 

它也比使用范围稍快。 从ipython shell:

 In [1]: timeit P = [ [()]*3 for i in range(3) ] 1000000 loops, best of 3: 1.41 us per loop In [2]: timeit P=[i[:] for i in [[()]*3]*3] 1000000 loops, best of 3: 1.27 us per loop