小编典典

Python:浅层和深层副本构造函数的实现

python

在大多数情况下,由于存在指针的概念,因此在C
++中易于实现复制构造函数(或重载的赋值运算符)。但是,我对如何在Python中实现浅层复制和深层复制感到非常困惑。

我知道其中一个库中有一些特殊命令,但是它们不适用于您自己编写的类。那么,常见的实现方式是什么?

PS将显示一些基本数据结构(链接列表或树)上的过程。

编辑:谢谢,他们的工作,这是我在语法上的错误。我对用__copy__()和覆盖这些功能非常感兴趣__deep_copy()__。例如。我如何在不知道数据结构中包含哪种类型的信息的情况下进行深层复制?


阅读 140

收藏
2020-12-20

共1个答案

小编典典

pythoncopy模块可以重用pickle模块接口,以使类自定义复制行为。

自定义类实例的默认值是创建一个新的空类,换出__class__属性,然后对于浅表副本,只需__dict__使用原始值更新副本中的即可。较深的副本将__dict__代替副本。

否则,您将指定一种__getstate__()返回内部状态的方法。这可以是您的班级__setstate__()可以再次接受的任何结构。

您还可以指定__copy__()和/或__deepcopy__()方法来
控制复制行为。这些方法有望自己完成所有复制,该__deepcopy__()方法将传递给备注映射以传递给递归deepcopy()调用。

例如:

from copy import deepcopy

class Foo(object):
    def __init__(self, bar):
        self.bar = bar
        self.spam = expression + that * generates - ham   # calculated

    def __copy__(self):
        # self.spam is to be ignored, it is calculated anew for the copy
        # create a new copy of ourselves *reusing* self.bar
        return type(self)(self.bar)

    def __deepcopy__(self, memo):
        # self.spam is to be ignored, it is calculated anew for the copy
        # create a new copy of ourselves with a deep copy of self.bar
        # pass on the memo mapping to recursive calls to copy.deepcopy
        return type(self)(deepcopy(self.bar, memo))

本示例定义了自定义复制钩子以防止self.spam复制,因为新实例将重新对其进行计算。

2020-12-20