嵌套列表声明

时间:2019-04-19 21:17:25

标签: python python-2.7

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]的地方,它设置在两个位置,但是在第二个设置为正确的地方..第一次分配有什么问题。

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]