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

__deepcopy__方法第二个参数是否必须命名为memo?深拷贝排除实现疑问

关于__deepcopy__参数名与深拷贝排除的问题

1. __deepcopy__的第二个参数必须命名为memo吗?

是的,从实际调用逻辑来说必须这么做——Python的copy.deepcopy()在调用对象的__deepcopy__方法时,会以关键字参数memo的形式传入第二个参数。如果你的__deepcopy__方法的第二个参数不是memo,也没有用**kwargs接收关键字参数,调用时会直接抛出TypeError,提示收到意外的关键字参数memo。

举个反例:

import copy

class Demo:
    def __deepcopy__(self, x):  # 参数名不是memo
        return self

copy.deepcopy(Demo())  # 报错:TypeError: Demo.__deepcopy__() got an unexpected keyword argument 'memo'

合法的写法只有两种:

  • 第二个参数明确命名为memo
  • 用**kwargs接收所有关键字参数(不推荐,不符合Python规范)

2. 用lambda self, _: self排除深拷贝可行吗?

不可行。这个lambda的第二个参数_只能接收位置参数,但deepcopy调用时是传关键字参数memo=xxx,会触发参数不匹配的错误。

示例错误代码:

import copy

obj = object()
obj.__deepcopy__ = lambda self, _: self

copy.deepcopy(obj)  # 报错:TypeError: <lambda>() got an unexpected keyword argument 'memo'

正确的写法是把lambda的第二个参数命名为memo,哪怕你不用它:

obj.__deepcopy__ = lambda self, memo: self

如果担心代码检查工具提示未使用参数,可以添加忽略注释(比如# noqa),但用memo命名更符合规范,也更清晰。


内容的提问来源于stack exchange,提问作者mutableVoid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:42:38