python - 如何深复制列表?

标签 python list copy deep-copy

E0_copy = list(E0) 之后,我猜 E0_copyE0 的深拷贝,因为 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/

相关文章:

python - 通过 ctypes 从 Python 调用的 C 函数返回不正确的值

python - 这个新的 Python 语法叫什么?

python - 为什么此代码不保存带有标题的图形?

r - 将 lm 输出列表转换为数据帧

python - 如何在迭代中复制列表?

python - 在 jupyter 笔记本中显示图像网格

python - 将变量分配给列表中的随机元素? Python

python - 如果我颠倒 zip 列表的顺序,为什么我会得到两个不同的词典

javascript - 如何将 <div> 复制到 &lt;textarea&gt; 副本中,以便在点击 "enter keyboard button"时也复制换行符?

python - 多线程文件复制比多核 CPU 上的单线程慢得多