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

