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