10

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

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

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

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

4

1 回答 1

24

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被复制,因为新实例将重新计算它。

于 2013-03-28T14:52:44.013 回答