最近在写python发现有个问题,函数的默认值是不可变的。
测试代码

1
2
3
4
5
6
def add_to_list(v, l = []):
l.append(v)
return l

print add_to_list(1)
print add_to_list(2)

期望返回:

1
2
[1]
[2]

事与愿违:

1
2
[1]
[1, 2]

why?

函数定义时候已经初始了函数默认值的对象,默认值实际已经是函数的一部分,每次调用函数,默认值都是同一个

怎么解决?

避免这种用法

或者这样调用?

1
2
print add_to_list(1, [])
print add_to_list(2, [])

显然违背了函数默认值的意义,换种写法:

1
2
3
4
5
def add_to_list(v, l = None):
if l is None:
l = []
l.append(v)
return l

在函数内初始化默认值可以,但是代码量也多了,或许只能折衷了。