Python 多重深度复制行为

标签 python deep-copy

假设我有两个类,例如 ManagerGraph,其中每个 Graph 都有对其管理器的引用,并且每个 Manager 都有对其管理器的图形集合的引用拥有。我希望能够做两件事

1) 复制一个图,这会执行深度复制,只不过新图引用与旧图相同的管理器。

2) 复制管理器,这会创建一个新管理器并复制其拥有的所有图表。

执行此操作的最佳方法是什么?我不想推出自己的深度复制实现,但标准 copy.deepcopy 似乎无法提供这种级别的灵活性。

最佳答案

您可以通过查看传递给 __deepcopy__ 特殊方法的 memodic 轻松完成此操作:

class Graph(object):
    def __init__(self, manager=None):
        self.manager = None if manager is None else weakref.ref(manager)
    def __deepcopy__(self, memodict):
        manager = self.manager()
        return Graph(memodict.get(id(manager), manager))

class Manager(object):
    def __init__(self, graphs=[]):
        self.graphs = graphs
        for g in self.graphs:
            g.manager = weakref.ref(self)

我假设您正在使用 weakref.ref 来打破 GraphManager 之间的循环;如果您使用其他东西,请适当调整。

>>> m = Manager([Graph(), Graph()])
>>> mc = copy.deepcopy(m)
>>> [g.manager() is mc for g in mc.graphs]
[True, True]
>>> copy.deepcopy(m.graphs[0]).manager() is m
True

关于Python 多重深度复制行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014042/

相关文章:

java - 在Java中,数组类型的字段是深复制还是浅复制?

java - python AES加密java解密

python - 有条件地改变Python中内部字典的值

Python CRC8计算

python - Python 中 copy.deepcopy 的运行时错误

Java克隆浅拷贝深拷贝复制构造函数嵌套对象

python - 使用 pandas 从一列字典创建一个热编码

python - Python 中的多输出多类机器学习

Python deepcopy 使用的内存比需要的多

C++ 带指针的拷贝构造函数