我有一个图形数据结构Overlay
,它由通过边互连的实例组成。实例由一组Instance
- 对象表示,边由一组Edge
- 对象表示。
为方便起见,每个实例都通过指向相应的现有Edge
对象来跟踪入边和出边。同样,每条边指向源和目标 - Instance
- 对象。
例如,叠加层可能包含通过边i1
连接到另一个实例i2
的实例e1
。 e1.source
是对i1
的引用,e2.dest
是对i2
的引用。 i1.edges_out
包含对e1
等的引用。总体而言,只有2个Instance
- 对象和1个Edge
- 对象。
我想深度复制叠加层,以便修改它(它的实例和边缘)而不影响其他叠加层。我的问题是,如上所述,我不知道如何保留互连引用的结构。
我使用new_overlay = copy.deepcopy(old_overlay)
并覆盖__deepcopy__
,Overlay
和Instance
中的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)。