如何在python3中创建一个重复的列表,而不因原来的小列表发生变化而影响新的列表?[重复]

问题描述 投票:0回答:1
init = [[0,1],[10,11]]
constr1 = [init for _ in range(5)]
constr2 = init * 5

第一个问题,为什么上述2个构造的列表没有给出相同的结果,而它们是

constr1 
[[[0, 1], [10, 11]],
[[0, 1], [10, 11]],
[[0, 1], [10, 11]],
[[0, 1], [10, 11]],
[[0, 1], [10, 11]]]

constr2
[[0, 1], [10, 11],
[0, 1], [10, 11],
[0, 1], [10, 11],
[0, 1], [10, 11],
[0, 1], [10, 11]]

而另一个问题是,如果我编辑了最初的列表。

init[0][1]=2

那么我们可以看到constr1和constr2都受到了影响,他们是

[[[0, 2], [10, 11]],
[[0, 2], [10, 11]],
[[0, 2], [10, 11]],
[[0, 2], [10, 11]],
[[0, 2], [10, 11]]]

[[0, 2], [10, 11],
[0, 2], [10, 11],
[0, 2], [10, 11],
[0, 2], [10, 11],
[0, 2], [10, 11]]

那么,有什么方法可以得到一个构造的列表(通过重复使用 list init),并且 constr 列表不受 init 列表中任何后续变化的影响?注意,我也尝试了这一行(在重启python shell清除所有变量后)。

constr1 = [init[:] for _ in range(5)]

但还是会受到init[0][1]的影响。

python-3.x nested-lists
1个回答
1
投票

好了,在找到 解除重复创建的嵌套列表的束缚?我试了一下,结果成功了

init = [[0,1],[10,11]]
from copy import deepcopy
constr1 = [deepcopy(init) for _ in range(5)]

现在的变化

init[0][1] = 2

不影响

constr1
[[[0, 1], [10, 11]],
 [[0, 1], [10, 11]],
 [[0, 1], [10, 11]],
 [[0, 1], [10, 11]],
 [[0, 1], [10, 11]]]
© www.soinside.com 2019 - 2024. All rights reserved.