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

Python列表默认参数累加异常问题及与整数默认参数的差异咨询

Python默认参数的常见陷阱:可变与不可变类型差异

问题场景

先看这段代码:

def myFunction(value, values=[]):
    values.append(value)
    return values

myFunction(1)
myFunction(2)
myFunction(3)

三次调用后输出的结果是[1,2,3],但预期的应该是每次调用返回只包含当前传入值的列表(比如第三次返回[3])。

为什么会这样?这个现象是不是只针对列表?比如用整数作为默认参数时,就没出现类似问题:

def myNumber(value, values = 10):
    if value > 100:
        values += 2
        return values
        
myNumber(101)  # 返回12
myNumber(102)  # 还是返回12

原因解析

核心在于Python默认参数的绑定时机,以及可变/不可变类型的特性:

  • 默认参数在函数定义时就会创建对应的对象,而不是每次调用函数时重新创建。
  • 可变类型(列表、字典、集合等)可以被修改:函数定义时创建了一个空列表,每次调用如果没传values参数,都会复用这个列表对象,append操作直接修改了这个对象的内容,导致多次调用的结果累积。
  • 不可变类型(整数、字符串、元组等)无法被修改:values += 2实际上是创建了一个新的整数对象(12),并返回这个新对象,但默认参数的原始对象(10)并没有被改变,所以下次调用时依然使用最初的默认值10,两次调用都会得到12。

正确写法

如果想让每次调用都使用新的空列表,应该把默认参数设为None,再在函数内部初始化:

def myFunction(value, values=None):
    if values is None:
        values = []
    values.append(value)
    return values

这样每次不传values时,都会创建一个新的空列表,三次调用会分别返回[1]、[2]、[3],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:24:23