You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:01