python - 具有重复元素的列表的 Python deepcopy
问题描述
我知道列表的复制和深度复制。但是,这个问题有点不同,因为我的原始列表是通过元素相乘生成的。
首先我生成原始列表list_ori = [[0]*3]*3
。我想要的是修改[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
然后得到[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
我尝试使用以下代码。
import copy
list_ori = [[0]*3]*3
list_copy = copy.deepcopy(list_ori)
list_copy[0][0] =1
print(list_copy)
因此,我得到了[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
. 但实际上,我想得到[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
我有 2 个幼稚的解决方案,但我想知道是否有更清晰的方法可以list_ori = [[0]*3]*3
通过深度复制然后对其进行修改来处理?
两个幼稚的解决方案:
1list_ori = [[0 for i in range(3)] for j in range(3)]
list_copy = copy.deepcopy(list_ori)
list_copy[0][0] =1
print(list_copy)
我更改了列表的生成方法。list_ori 没有列表中的重复元素。
2m = n = 3
test = [[0] * m] * n
print(test)
test_copy = [copy.copy(element) for element in test]
test_copy[0][0] = 1
print(test_copy)
此方法迭代列表的元素。这种方法会破坏列表的结构吗?
解决方案
首先,list_ori = [[0 for i in range(3)] for j in range(3)]
不需要深拷贝,只需执行以下操作:
list_ori = [[0 for i in range(3)] for j in range(3)]
list_copy[0][0] = 1
print(list_copy)
输出:
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
推荐阅读
- javascript - Tempus-dominus 和 sweetalert2
- apache-flink - Flink,使用 Hadoop 兼容性时的奇怪行为
- ios - Xcode 一直显示:-1: SWIFT_VERSION '5.0' is unsupported, 支持的版本是:3.0, 4.0, 4.2。任何解决方案?
- pyspark - 为什么胶水 pyspark ETL 作业无法将新列添加到镶木地板表中?
- jenkins - 无论如何要从 sshPublisher 获得一些返回码或异常?
- python - 如何从 Windows PC 创建 Pygame dmg 文件?
- javascript - 如何让 Socket 只发送给请求的客户端?
- html - 我可以为“网格列”设置动画吗?
- php - 管理下单逻辑
- python - TensorFlow Hub 模块可以在 TensorFlow 2.0 中使用吗?