两个列表的深拷贝

Jia*_* Lu 5 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])
Run Code Online (Sandbox Code Playgroud)

通过使用deepcopy的操作,我创建了两个新的列表u_list1,并u_list2独立于从list1list2,这正是我需要的。但是,我发现一个问题。在节点实例u_list1u_list2现在也是独立的。它们在内存中具有不同的地址。是否有可能在同一个实例u_list1,并u_list2仍然共享一个地址,就像在实例list1list2

我需要的是id1 = id2, u_id1 = u_id2, while id1 != u_id1

Kel*_*ndy 9

您可以deepcopy通过将它们深度复制在一起来使用的备忘录方面:

u_list1, u_list2 = copy.deepcopy((list1, list2))
Run Code Online (Sandbox Code Playgroud)

文档(强调我的):

深拷贝操作通常存在两个问题,而浅拷贝操作不存在这些问题:

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

  • 因为深拷贝会复制所有内容,所以它可能会复制太多,例如打算在副本之间共享的数据。

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

  • 保留在当前复制过程中已复制对象的备忘录字典;和