__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
相关产品推荐
相关产品推荐

