两个列表的深层复制

时间:2020-07-28 23:44:04

标签: python deep-copy

我在python中有两个列表,它们以不同的方式(例如顺序)存储一些类实例。现在,出于某种目的(独立于现有列表),我想创建这两个列表的副本。为了清楚地说明我的问题,我在下面创建了一个演示代码。

import copy

class Node:
    def __init__(self):
        self.node_id = 0

node = Node()
list1 = [node]
list2 = [node]

u_list1 = copy.deepcopy(list1)
u_list2 = copy.deepcopy(list2)

id1 = id(list1[0])
id2 = id(list2[0])
u_id1 = id(u_list1[0])
u_id2 = id(u_list2[0])

通过使用Deepcopy操作,我创建了两个独立于u_list1u_list2的新列表list1list2。但是,我发现了一个问题。 u_list1u_list2中的节点实例现在也相互独立。它们在内存中具有不同的地址。像u_list1u_list2中的实例一样,list1list2中的相同实例是否仍可以共享一个地址?

我需要的是id1 = id2u_id1 = u_id2,而id1 != u_id1

1 个答案:

答案 0 :(得分:9)

您可以通过将deepcopy的备忘内容复制到一起来进行复制:

u_list1, u_list2 = copy.deepcopy((list1, list2))

来自documentation(重点是我):

深层复制操作通常存在两个问题,浅层复制操作通常不存在两个问题:

  • 递归对象(直接或间接包含对自己的引用的复合对象)可能会导致递归循环。

  • 因为深层复制会复制所有可能复制的内容,例如打算在副本之间共享的数据

deepcopy()函数通过以下方式避免了这些问题:

    在当前复制过程中
  • 保存已复制对象的备忘录字典;和
相关问题