【问题标题】:Python: Implementation of shallow and deep copy constructorsPython:浅拷贝和深拷贝构造函数的实现
【发布时间】:2013-03-19 01:41:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你是什么意思库不能在你自己设计的类上工作? copy.copycopy.deepcopy 有什么问题?

标签: python copy-constructor deep-copy


【解决方案1】:

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

【讨论】:

  • 我对最后一个解决方案非常感兴趣。如何在不知道类型的情况下从另一个值复制一个值?我应该只写所有类型还是有更简单的解决方案?
  • @KudayarPirimbaev:您将包含的值委托给 copy.deepcopy 递归调用。它会处理不同的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2012-04-12
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多