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
相关产品推荐
相关产品推荐

