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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:45:03