mytest=[[False]*3]*2
In [46]: mytest
Out[46]: [[False, False, False], [False, False, False]]
In [47]: mytest[0][1]=True
In [48]: mytest
Out[48]: [[False, True, False], [False, True, False]]
On the other hand
mytest=[ [False]*3 for i in range(2)]
In [53]: mytest[0][1]=True
In [54]: mytest
Out[54]: [[False, True, False], [False, False, False]]
在第一个设置为[0] [1]的地方,它设置在两个位置,但是在第二个设置为正确的地方..第一次分配有什么问题。
答案 0 :(得分:2)
这是Python处理对象的方式。在第一个示例中,列表mytest
包含两个[False, False, False]
列表,它们存储在相同的存储位置(即列表中的两个项目都指向相同的存储位置)。更改一个时,另一个也会更改,因为它们都指向内存中的同一列表。
在第二个示例中,当您使用列表理解时,两个列表[False, False, False]
是两个指向不同内存位置的不同对象。
证明
>>> mytest=[[False]*3]*2
>>> id(mytest[0])
4340367304
>>> id(mytest[1])
4340367304
>>> mytest=[ [False]*3 for i in range(2)]
>>> id(mytest[0])
4340436936
>>> id(mytest[1])
4340498512
与第一条语句和第二条语句的区别在于,您的第一条语句将首先对[False] * 3
进行求值,这首先得到[False, False, False]
,然后*2
将创建该对象的两个引用({{1 }})。在第二个示例中,您每次创建一个[False, False, False]
。