在大多数情况下,在 C++ 中实现复制构造函数(或重载赋值运算符)很容易,因为有指针的概念。但是,我对如何在 Python 中实现浅拷贝和深拷贝感到很困惑。
我知道其中一个库中有特殊命令,但它们不适用于您自己编写的类。那么常见的实现方式有哪些呢?
附言显示一些基本数据结构(链表或树)的过程将不胜感激。
编辑:谢谢,他们成功了,这是我的语法错误。
我对用 __copy__()
和 __deep_copy()__
覆盖这些函数非常感兴趣。例如。如何在不知道数据结构中的信息类型的情况下进行深拷贝?
最佳答案
python copy
module可以重复使用 pickle
module让类自定义复制行为的接口(interface)。
自定义类实例的默认设置是创建一个新的空类,换出 __class__
属性,然后对于浅拷贝,只需更新 __dict__
使用原始值进行复制。深拷贝在 __dict__
上递归。
否则,您指定一个__getstate__()
方法来返回内部状态。这可以是您的类 __setstate__()
可以再次接受的任何结构。
您还可以指定 __copy__()
和/或 __deepcopy__()
方法来控制 just 复制行为。这些方法应该自己完成所有复制,__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))
此示例定义了自定义复制 Hook 以防止 self.spam
也被复制,因为新实例将重新计算它。
关于Python:浅拷贝构造函数和深拷贝构造函数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15684881/