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

Python中def test(t=[])默认关键字参数的存储位置问题

Python可变默认参数的存储位置

你排查的几个位置都不对,这个作为默认参数的列表实际存储在函数对象的__defaults__属性中。

__defaults__是一个元组,按参数定义的从左到右顺序,存储所有位置/通用关键字参数的默认值。你定义完函数直接打印这个属性就能看到对应的列表对象:

def test(t=[]):
    t.append(1)
    print(t)

print(test.__defaults__)
# 运行结果:([],)

连续两次无参调用后再查看,就能看到列表里的元素已经被追加修改:

test()  # 输出 [1]
test()  # 输出 [1, 1]
print(test.__defaults__)
# 运行结果:([1, 1],)

补充几个相关说明:

  • 函数的__dict__属性只存储你手动给函数绑定的自定义属性,和参数默认值无关
  • 默认参数对象是函数定义阶段就创建完成的,不会出现在globals()全局作用域或者调用时生成的locals()局部作用域里
  • 如果是*args之后声明的仅限关键字参数,它的默认值会存在函数的__kwdefaults__字典中,以参数名为键,默认值为值,不会放在__defaults__元组里

这也是Python经典的可变默认参数坑的根本原因:默认参数在函数定义时就被创建为固定对象,每次无参调用都会复用同一个对象,对可变类型的修改会被持续保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:36:20