Python中copy.deepcopy()内部实现解析及__deepcopy__()正确重写方法
重写Python对象__deepcopy__时的memo检查疑问与copy模块底层解析
之前看Stack Overflow上Antony Hatchkins分享的「如何重写Python对象的copy/deepcopy操作」内容时,发现他实现的*deepcopy方法里没有先检查memo字典中是否已经存在当前对象的副本,这让我十分困惑。Antonín Hoskovec的评论也指出了这个问题,而Jonathan H提到copy.deepcopy()会在对象已被复制时终止deepcopy*的调用,但没明确指出copy模块代码里对应的逻辑位置。
举个场景就能说明不检查memo的问题:假设对象a引用了b和c,而b和c又都引用了同一个对象d。对a执行deepcopy时,d应该只被复制一次(哪个引用先被处理就复制哪一个,后续直接复用副本)。
我最核心的疑问是:为什么Antony Hatchkins的回答里没有加上这段检查memo的代码?
from copy import deepcopy class A: def __deepcopy__(self, memo): # 为何不添加以下两行? if id(self) in memo: return memo[id(self)] cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for k, v in self.__dict__.items(): setattr(result, k, deepcopy(v, memo)) return result
因此希望有人能解析copy.deepcopy()的内部实现逻辑,既要给出重写*deepcopy*的最佳实践,也要把底层原理讲清楚。我之前粗略翻过copy.deepcopy()的源码,但对其中的copier、reductor、_reconstruct这些概念始终摸不透,查了其他相关回答也没得到全面的解答和原理说明。
内容的提问来源于stack exchange,提问作者Tom Lin
相关产品推荐
相关产品推荐

