Python:浅拷贝构造函数和深拷贝构造函数的实现

标签 python copy-constructor deep-copy

在大多数情况下,在 C++ 中实现复制构造函数(或重载赋值运算符)很容易,因为有指针的概念。但是,我对如何在 Python 中实现浅拷贝和深拷贝感到很困惑。

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

附言显示一些基本数据结构(链表或树)的过程将不胜感激。

编辑:谢谢,他们成功了,这是我的语法错误。 我对用 __copy__()__deep_copy()__ 覆盖这些函数非常感兴趣。例如。如何在不知道数据结构中的信息类型的情况下进行深拷贝?

最佳答案

python copy module可以重复使用 pickle module让类自定义复制行为的接口(interface)。

自定义类实例的默认设置是创建一个新的空类,换出 __class__ 属性,然后对于浅拷贝,只需更新 __dict__使用原始值进行复制。深拷贝在 __dict__ 上递归。

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

您还可以指定 __copy__() 和/或 __deepcopy__() 方法来控制 just 复制行为。这些方法应该自己完成所有复制,__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))

此示例定义了自定义复制 Hook 以防止 self.spam 也被复制,因为新实例将重新计算它。

关于Python:浅拷贝构造函数和深拷贝构造函数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15684881/

相关文章:

c++ - VC++ 15 为 lambda 捕获调用了错误的复制构造函数?

C++ 传递 std::string 的最快方法?

angular - 如何在不使用 JQuery 函数的情况下以 angular 4 进行深度复制?

Java ArrayList 复制构造函数

c++ - 在C++中实现双向链表复制构造函数

c# n-ary树的深拷贝

python - 为什么 Anaconda 中的多处理比 Python 慢

python - 使用 reportlab 将 .SVG 文件嵌入到 PDF 中

python - 使用 CherryPy 延迟声明静态文件/文件夹

python - 将 sympy 与 pypy 一起使用时没有加速