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