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



在c++中实现复制构造函数(或重载赋值操作符)在大多数情况下都很容易,因为有了指针的概念。然而,我很困惑如何在Python中实现浅拷贝和深拷贝。

我知道在某个库中有一些特殊的命令,但是它们对你自己编写的类不起作用。那么常见的实现方法是什么呢?

注:显示一些基本数据结构(链表或树)的过程将受到赞赏。

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

python copy模块可以重用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被复制,因为一个新的实例将重新计算它。

最新更新