可变默认参数

函数定义:

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