首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制与深度复制:语义

复制与深度复制:语义
EN

Stack Overflow用户
提问于 2012-04-21 05:34:34
回答 2查看 703关注 0票数 6

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-21 06:04:53

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-21 06:08:36

这和你的情况相似吗?

代码语言:javascript
复制
import copy

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

如果是这样,则看起来您不需要定义__copy____deepcopy__,因为copy.deepcopy的默认行为共享类属性和深度副本实例属性:

代码语言:javascript
复制
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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10253855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档