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

Python默认参数陷阱:为何f()+f()返回[3,3,3,3]而非[3,3,3]?

为什么f()+f()的结果是[3,3,3,3]而非[3,3,3]?

这是Python里一个经典的默认参数陷阱,核心原因很简单:Python的默认参数是在函数定义时就完成初始化,而不是每次调用函数时重新创建的。咱们一步步拆解来理清楚:

先搞懂函数f的默认参数行为

当你写下def f(x=[]):的时候,Python会在这个函数被定义的瞬间,创建一个空列表作为x的默认值。这个列表是全局唯一的——每次你调用f()(不带参数)时,都会复用同一个列表,而不是每次都生成新的空列表。

分析print(f()+f())的执行过程

咱们把这个表达式拆成三步来看:

  1. 第一次调用f():
    • 复用那个预先创建的默认空列表,执行x += [3],此时这个列表变成[3],函数返回这个列表。所以第一个f()的返回值是[3]。
  2. 第二次调用f():
    • 还是用同一个默认列表(现在已经是[3]了),执行x += [3],列表变成[3,3],函数返回这个列表。所以第二个f()的返回值是[3,3]。
  3. 两个返回值相加:
    • 列表的+操作是把两个列表的元素合并,也就是[3] + [3,3],结果自然是[3,3,3,3]。

再看单独调用print(f())的情况

这时候是在f()+f()执行之后调用的:

  • 此时默认列表已经是[3,3]了,调用f()时,执行x += [3],列表变成[3,3,3],函数返回它,所以输出是[3,3,3]。

如何避免这个陷阱?

如果你希望每次调用f()(不带参数)时都使用新的空列表,应该把默认参数设为None,然后在函数内部初始化列表:

def f(x=None):
    if x is None:
        x = []
    x += [3]
    return x

这样每次调用f()时,都会创建一个全新的空列表,就不会出现复用默认列表的问题了。

内容的提问来源于stack exchange,提问作者md. zubair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:53:45