在 E0_copy = list(E0)
之后,我猜 E0_copy
是 E0
的深拷贝,因为 id(E0)
不等于 id(E0_copy)
。然后我在循环中修改了E0_copy
,但是为什么之后的E0
不一样呢?
E0 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for k in range(3):
E0_copy = list(E0)
E0_copy[k][k] = 0
#print(E0_copy)
print E0 # -> [[0, 2, 3], [4, 0, 6], [7, 8, 0]]
最佳答案
E0_copy
不是深拷贝。您不会使用 list()
进行深度复制。 (list(...)
和 testList[:]
都是浅拷贝。)
您使用 copy.deepcopy(...)
用于深度复制列表。
deepcopy(x, memo=None, _nil=[])
Deep copy operation on arbitrary Python objects.
请参阅以下代码段 -
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]
现在看deepcopy
操作
>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]
解释一下,list(...)
不会递归地复制内部对象。它只复制最外层列表,同时仍然引用相同的内部列表,因此,当您改变内部列表时,更改会同时反射(reflect)在原始列表和浅拷贝中。您可以通过检查 id(a[0]) == id(b[0])
where b = list(a)
来看到浅复制引用了内部列表.
关于python - 如何深复制列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744381/