Python函数默认参数疑问:修改外部变量后默认值为何未更新?
Python默认参数的绑定陷阱:为什么你的输出不是预期的?
这是个特别常见的Python新手“踩坑”问题,我来给你讲明白背后的逻辑~
核心原因:默认参数在函数定义时就完成绑定
Python里函数的默认参数值,是在你写下def定义函数的那一刻就确定并存储起来的,而不是在每次调用函数的时候才去读取变量的值。
我们一步步拆解你的代码:
- 首先你执行了
d = 666,这时候全局变量d的值是666。 - 接着定义函数
def default_due(a, b=d):——这时候Python会把当前d的取值(也就是666)直接绑定到参数b的默认值上,相当于把b的默认值“固定”成了666,和后续d的变化彻底没关系了。 - 之后你把
d改成了0,但这个修改只影响全局变量d,函数里b的默认值已经在定义时就存好了666,所以调用default_due(11)时,b自然用的是最初绑定的666。 - 而调用
default_due(22,33)时,你显式传递了参数33给b,所以会覆盖默认值,输出a = 22 b = 33。
再举个更直观的例子加深理解
如果默认参数是可变对象(比如列表),这个绑定逻辑会表现得更明显:
def add_item(lst=[]): lst.append("hello") print(lst) add_item() # 输出: ['hello'] add_item() # 输出: ['hello', 'hello']
因为默认列表是在函数定义时就创建的同一个对象,每次调用都会往这个对象里加元素,而不是每次调用都新建一个空列表。
如何实现“调用时取当前变量值”的需求?
如果想要让默认参数在调用时才读取当前d的值,可以用None作为默认占位符,然后在函数内部赋值:
d = 666 def default_due(a, b=None): # 如果没有传b,就用当前的d值 if b is None: b = d print('a =', a, 'b =', b) d = 0 default_due(11) # 现在会输出: a = 11 b = 0 default_due(22,33) # 输出: a = 22 b = 33
内容的提问来源于stack exchange,提问作者user12210291
相关产品推荐
相关产品推荐

