python - 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.
解决方案
这就是 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]
推荐阅读
- window - 如何将 vmdk 映像转换为 hda.qcow2
- java - 如何在 Javafx 中比较 2 个字段文本
- python - python打印功能中的内容没有打印出来
- mysql - 在一张表中比较查询结果并报告“True”或“False”
- sql-server - 如何在节点 js 中使用 sequelize 将数据数组插入 SQL Server 数据库
- javascript - 在刀片模板中使用 JavaScript 在 html 表中显示月份和日期
- php - 使用一个模板为 laravel 中的每种语言都有一个单独的 URL
- git - git clean 想要删除被忽略的目录
- java - Spring boot - 存储图像的最佳方式(SQL 后端)
- javascript - 在 Internet Explorer 中使用 selenium 的 JavascriptExecutor 打开一个新选项卡