深层复制互连对象并引用彼此

时间:2016-12-30 11:16:34

标签: python graph reference deep-copy

我有一个图形数据结构Overlay,它由通过边互连的实例组成。实例由一组Instance - 对象表示,边由一组Edge - 对象表示。 为方便起见,每个实例都通过指向相应的现有Edge对象来跟踪入边和出边。同样,每条边指向源和目标 - Instance - 对象。

例如,叠加层可能包含通过边i1连接到另一个实例i2的实例e1e1.source是对i1的引用,e2.dest是对i2的引用。 i1.edges_out包含对e1等的引用。总体而言,只有2个Instance - 对象和1个Edge - 对象。

我想深度复制叠加层,以便修改它(它的实例和边缘)而不影响其他叠加层。我的问题是,如上所述,我不知道如何保留互连引用的结构。

我使用new_overlay = copy.deepcopy(old_overlay)并覆盖__deepcopy__OverlayInstance中的Edge,如下所示:

Overlay

def __deepcopy__(self, memodict={}):
    new_overlay = Overlay(self.template, set(), set())  # new, empty overlay
    new_overlay.instances = copy.deepcopy(self.instances, memodict)
    new_overlay.edges = copy.deepcopy(self.edges, memodict)
    return new_overlay

Instance

def __deepcopy__(self, memodict={}):
    # new instance with same attributes
    new_instance = Instance(self.attributes)
    # edges_in, _out should contain references to the existing edges, not new objects
    new_instance.edges_in = copy.deepcopy(self.edges_in, memodict)
    new_instance.edges_out = copy.deepcopy(self.edges_out, memodict)
    return new_instance

Edge

def __deepcopy__(self, memodict={}):
    # new edge with same source and destination: these should be references to existing instances, not new objects
    new_edge = Edge(copy.deepcopy(self.source, memodict), copy.deepcopy(self.dest, memodict))
    new_instance.attribute = self.attribute  # no need to deep copy
    return new_edge

我希望copy.deepcopy能够使用memodict来处理所有事情,但它不起作用:使用PyCharm调试器检查对象 - id时,复制的叠加层中的引用有时是不正确的。不是引用现有对象,例如现有实例作为边的源/目标,而是创建新的实例对象。

如何在保留引用结构的同时深度复制Overlay?两个边都应该引用实例(源/目标),实例应该引用边(edges_in / edges_out)。

0 个答案:

没有答案