【问题标题】:Deepcopy of two lists两个列表的深拷贝
【发布时间】:2020-07-28 23:44:04
【问题描述】:

我在 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

【问题讨论】:

  • 只是一种更 Pythonic 的方式来编写需求:id2 == id1 != u_id1 == u_id2 :-)

标签: python deep-copy


【解决方案1】:

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

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

来自documentation(强调我的):

深拷贝操作经常存在两个浅拷贝操作不存在的问题:

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

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

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

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

【讨论】:

  • 有趣,我以前没有遇到过这种方法。
  • 非常好的答案!
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多