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

Python函数默认参数疑问:修改外部变量后默认值为何未更新?

Python默认参数的绑定陷阱:为什么你的输出不是预期的?

这是个特别常见的Python新手“踩坑”问题,我来给你讲明白背后的逻辑~

核心原因:默认参数在函数定义时就完成绑定

Python里函数的默认参数值,是在你写下def定义函数的那一刻就确定并存储起来的,而不是在每次调用函数的时候才去读取变量的值。

我们一步步拆解你的代码:

  1. 首先你执行了d = 666,这时候全局变量d的值是666。
  2. 接着定义函数def default_due(a, b=d):——这时候Python会把当前d的取值(也就是666)直接绑定到参数b的默认值上,相当于把b的默认值“固定”成了666,和后续d的变化彻底没关系了。
  3. 之后你把d改成了0,但这个修改只影响全局变量d,函数里b的默认值已经在定义时就存好了666,所以调用default_due(11)时,b自然用的是最初绑定的666。
  4. 而调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:07:38