Python 嵌套列表声明

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

在第一个集合[0][1]中,它设置在两个位置,但在第二个集合中,它设置正确。。第一次赋值有什么问题。

这就是Python处理对象的方式。在第一个示例中,列表
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