首页 > 解决方案 > 具有重复元素的列表的 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通过深度复制然后对其进行修改来处理?

两个幼稚的解决方案:

1
list_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 没有列表中的重复元素。

2
m = 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)

此方法迭代列表的元素。这种方法会破坏列表的结构吗?

标签: python

解决方案


首先,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]]

推荐阅读