Python中无参调用类构造函数时__init__默认参数为何出现非预期值?
问题原因
这个现象的核心逻辑还是Python可变默认参数的绑定机制,只是触发场景和常见的“函数内部直接修改默认参数”的情况不同:
- Python的函数默认参数是在函数定义阶段就完成创建并绑定到函数对象的,不会在每次调用函数时重新生成。你的
__init__方法将可变对象{}作为aDic的默认值,意味着所有无参调用Foo()的实例,拿到的aDic都是同一个字典对象。 - 你在
clone方法中无参创建newValue = Foo()时,newValue.aDic直接指向了这个全局唯一的默认字典对象。后续你执行newValue.aDic[k] = v的写操作,本质是直接修改了__init__的默认参数本身的值。 - 第一次执行
clone后,默认字典已经被修改为{'b': 222},第二次无参调用Foo()时,__init__拿到的aDic已经不是空值,就会触发WARNING日志,之后的调用会不断累加修改这个默认字典的内容。
修复方案
修改__init__的默认参数声明,用不可变的None作为占位符,在函数内部动态初始化空字典:
def __init__(self, aDic = None): if aDic is None: aDic = {} self.aDic = aDic
这样每次无参调用Foo()时,都会生成一个独立的新空字典,不会再共享同一个默认对象,也就不会出现参数值异常变化的问题。
内容的提问来源于stack exchange,提问作者zijuexiansheng
相关产品推荐
相关产品推荐

