很抽象的小坑,所有可变对象作为默认参数,都会出现这个问题。背后的本质是可变对象只是一个引用,而不是具体的值。
我们一般默认是每次调用函数应该是重新新建一个空列表,但是实际上,它只会在函数定义的那一刻创建一次这个列表。然后所有的调用都是使用这一个列表。
def func(a,b=[]):
b.append(a)
return b
print(func(1))
[1]
print(func(2))
[1, 2]
print(func(3))
[1, 2, 3]
解决方案也很简单,就是使用None,也就是将可变对象的定义放到函数内部,这样就避免了此类问题。
def func2(a,b=None):
if b == None:
b=[]
b.append(a)
return b
print(func2(1))
[1]
print(func2(2))
[2]
print(func2(3))
[3]
print(func2(1,[1]))
[1, 1]