在大多数情况下,在C ++中很容易实现复制构造函数(或重载赋值运算符),因为有一个指针的概念。但是,我对如何在Python中实现浅层和深层复制感到困惑。
我知道其中一个库中有特殊命令,但它们不适用于您自己编写的类。那么实施的常用方法有哪些?
P.S。显示一些基本数据结构(链表或树)的过程将不胜感激。
编辑:谢谢,他们工作,这是我在语法上的错误。 我对使用__copy__()
和__deep_copy()__
覆盖这些功能非常感兴趣。例如。如何在不知道数据结构中包含哪种类型的信息的情况下进行深层复制?
答案 0 :(得分:24)
python copy
module可以重用pickle
module接口,让类自定义复制行为。
自定义类实例的默认设置是创建一个新的空类,交换__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
被复制,因为新实例将重新计算它。