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())的执行过程
咱们把这个表达式拆成三步来看:
- 第一次调用
f():- 复用那个预先创建的默认空列表,执行
x += [3],此时这个列表变成[3],函数返回这个列表。所以第一个f()的返回值是[3]。
- 复用那个预先创建的默认空列表,执行
- 第二次调用
f():- 还是用同一个默认列表(现在已经是
[3]了),执行x += [3],列表变成[3,3],函数返回这个列表。所以第二个f()的返回值是[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
相关产品推荐
相关产品推荐

