可变默认参数
函数定义:
def append_to(element, to=[]):
to.append(element)
return to
函数调用:
print(append_to(10))
print(append_to(20))
期望的结果:
每次调用函数时,如果不提供第二个参数,就会创建一个新的列表,所以结果应是这样的:
[10]
[20]
事实的结果:
当函数被定义时,一个新的列表就被创建一次 ,而且同一个列表在每次成功的调用中都被使用:
[10]
[10, 20]
结论:
当函数被定义时,Python的默认参数就被创建一次,而不是每次调用函数的时候创建。
这意味着,如果使用一个可变默认参数并改变了它,将会在未来所有对此函数的调用中改变这个对象。
应该使用的方法:
在每次函数调用中,通过使用指示没有提供参数的默认参数(None通常是个好选择),来创建一个新的对象:
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to