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]的影响。
好了,在找到 解除重复创建的嵌套列表的束缚?我试了一下,结果成功了
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]]]