copy vs deepcopy:语义

时间:2012-04-20 21:34:34

标签: python python-3.x copy deep-copy

我的班级代表各种系统的状态。每个实例都有两个属性:一个是在同一系统的所有状态之间共享的容器,另一个是每个实例唯一的容器。

状态副本应重用“共享”属性,但要创建“唯一”属性的深层副本。这实际上是唯一有意义的复制语义(状态副本自然是同一系统的状态)。

我想为阅读和维护我的代码的人创造最少的惊喜。我应该为我的目的覆盖__deepcopy____copy__吗?

2 个答案:

答案 0 :(得分:3)

是否真的有必要使用复制模块复制此类的实例?我认为,不应该覆盖__copy____deepcopy__,而应该为您的类创建一个copy方法,该方法使用您定义的复制语义返回一个新对象。

如果出于某些一致性原因,您确实需要使用复制模块,那么在我看来__deepcopy__更合适。如果它是所有实例共享其中一个容器的类的已定义行为,那么可以合理地假设__deepcopy__的实现会尊重该行为。

答案 1 :(得分:0)

这与您的情况类似吗?

import copy

class Foo(object):
    shared = [[]]
    def __init__(self):
        self.perinstance = [[]]

如果是这样,那么您似乎不需要定义__copy____deepcopy__,因为copy.deepcopy的默认行为共享类属性和deepcopies实例属性:

x = Foo()
z = copy.deepcopy(x)
assert id(z.shared) == id(x.shared)
assert id(z.shared[0]) == id(x.shared[0])
assert id(z.perinstance) != id(x.perinstance)
assert id(z.perinstance[0]) != id(x.perinstance[0])
相关问题