Python:浅层和深层复制构造函数的实现

Kud*_*aev 10 python deep-copy copy-constructor

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

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

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

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

Mar*_*ers 24

python copy模块可以重用pickle模块接口,让类自定义复制行为.

自定义类实例的默认设置是创建一个新的空类,交换该__class__属性,然后对于浅复制,只需__dict__使用原始值更新副本.一个深层拷贝递归了__dict__.

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

您还可以指定__copy__()和/或__deepcopy__()方法来控制只是复制行为.这些方法有望完成所有的复制,__deepcopy__()方法是通过memo映射传递给递归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))
Run Code Online (Sandbox Code Playgroud)

此示例定义自定义副本挂钩以防止self.spam被复制,因为新实例将重新计算它.