python - 列表值更改中的意外行为
问题描述
我定义了这个函数:
def newMap(dim, n):
tc = [0 for i in range(n)]
return [[tc for _ in range(dim)] for _ in range(dim)]
这会创建一个零列表列表。例如
m = newMap(2,2)
print(m)
返回
[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
我想改变一个操作系统来获得[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
并尝试这样做
m[0][0][0] = 1
其中,意外返回[[[1, 0], [1, 0]], [[1, 0], [1, 0]]]
而不是[[[1, 0], [0, 0]], [[0, 0], [0, 0]]]
.
但是,如果我定义a = [[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
, 然后做
a[0][0][0] = 1
print(a)
它返回[[[1, 0], [0, 0]], [[0, 0], [0, 0]]]
,这就是我想要的。
为什么会这样?这两个定义不应该是等价的吗?我怎样才能防止它在第一种情况下发生?
解决方案
使用 tc.copy() 这应该可以解决它,我试过了,它可以工作:
def newMap(dim, n):
tc = [0 for i in range(n)]
return [[tc.copy() for _ in range(dim)] for _ in range(dim)]
a = newMap(2,2)
a
#[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
a[0][0][0] = 1
#[[[1, 0], [0, 0]], [[0, 0], [0, 0]]]
推荐阅读
- android - 我们如何模拟从主机到 Android 模拟器的虚拟 CAN 设备?
- ruby - 使用文本变量填充文本字段,如何?
- ios - Xcode 11:画布不显示
- java - 如何将字符串转换为文件以便在 Android 中共享?
- visual-studio - 什么是 2019 年的现代 SSRS 开发环境?
- python - 如何通过 css 选择器为 Python selenium 中的日期字段查找元素?
- swift - 如何检测用户何时更改 macOS 上的空间?
- sharepoint - 在 SharePoint 2016 中使用 CSR 修改默认列表表单
- apache-flink - 是否可以配置 Flink 飞行前类型的序列化扫描?
- vue.js - 为什么 Gridsome 在 dist 构建中使用 Vue?