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

Python方法默认参数异常:为何字典默认值跨调用持久化?

Python 函数默认参数的行为误区解析

先看这段代码:

class C:
    def b(self,d = {'k':0}):
        print(d)
        d['k'] += 1
    def a(self):
        self.b()
c1 = C()
for i in range(3):
    c1.a()

实际运行输出是:

{'k': 0}
{'k': 1}
{'k': 2}

下面针对两个错误表述逐一纠正:

错误表述1:调用b方法不传参时应使用d的默认值

这句话的核心错误是对默认参数的创建时机理解错误。Python里函数的默认参数是在函数定义的那一刻就完成初始化,而不是每次调用函数时重新生成。第一次调用b()不传参时,确实用了初始的{'k':0},但后续不传参调用时,复用的是同一个已经被修改过的字典对象,而非重新创建全新的{'k':0}。所以不是“每次调用都用全新默认值”,而是一直用定义时生成的那个默认对象。

错误表述2:d应为b方法的局部变量,不应在多次调用间持久化

d确实是b方法的局部变量,但这里混淆了“局部变量”和“变量指向的可变对象”:每次调用b时,局部变量d会被绑定到某个对象——不传参时就绑定到定义阶段创建的那个字典。由于字典是可变对象,修改d['k']本质是修改这个对象的内容,而非改变d的绑定关系。这个可变对象在函数定义后就一直存在,所以多次调用间它的状态会被保留,造成“持久化”的假象,本质是复用了同一个可变默认对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:04