首页 > 解决方案 > Nested List declaration

问题描述

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]]

On the first when in set [0][1], it sets at two places , but in second it sets correctly .. what is wrong with first assignment.

标签: pythonpython-2.7

解决方案


这就是 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创建该对象的两个引用 ( [False, False, False])。在第二个示例中,您每次都创建一个。[False, False, False]


推荐阅读