Python 嵌套列表声明
在第一个集合[0][1]中,它设置在两个位置,但在第二个集合中,它设置正确。。第一次赋值有什么问题。这就是Python处理对象的方式。在第一个示例中,列表Python 嵌套列表声明,python,python-2.7,Python,Python 2.7,在第一个集合[0][1]中,它设置在两个位置,但在第二个集合中,它设置正确。。第一次赋值有什么问题。这就是Python处理对象的方式。在第一个示例中,列表mytest包含两个存储在同一内存位置的[False,False,False]列表(即列表中的两个项目都指向同一内存位置)。当您更改其中一个时,另一个也会更改,因为它们都指向内存中的同一个列表 在第二个示例中,当您使用列表理解时,两个列表是指向不同内存位置的两个不同对象 证明 第一个和第二个语句的区别在于,您的第一个语句将首先计算[False]
mytest
包含两个存储在同一内存位置的[False,False,False]
列表(即列表中的两个项目都指向同一内存位置)。当您更改其中一个时,另一个也会更改,因为它们都指向内存中的同一个列表
在第二个示例中,当您使用列表理解时,两个列表是指向不同内存位置的两个不同对象
证明
第一个和第二个语句的区别在于,您的第一个语句将首先计算
[False]*3
,它给出[False,False,False]
,然后*2
将创建该对象的两个引用([False,False,False]
)。在第二个示例中,您每次都在创建[False,False,False]
。这就是Python处理对象的方式。在第一个示例中,列表mytest
包含两个存储在同一内存位置的[False,False,False]
列表(即列表中的两个项目都指向同一内存位置)。当您更改其中一个时,另一个也会更改,因为它们都指向内存中的同一个列表
在第二个示例中,当您使用列表理解时,两个列表是指向不同内存位置的两个不同对象
证明
第一个和第二个语句的区别在于,您的第一个语句将首先计算[False]*3
,它给出[False,False,False]
,然后*2
将创建该对象的两个引用([False,False,False]
)。在第二个示例中,您每次都创建一个[False,False,False]
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]]
>>> 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