当函数被定义时,Python的默认参数就被创建一次,而不是每次调用函数的时候创建。所有默认参数值则存储在函数对象的 __defaults__
属性中,它的值为一个列表,列表中每一个元素均为一个默认参数的值。
def add(x, y=1):
return x + y
print(add.__defaults__) # => (1,)
这意味着,如果参数的默认值是一个不可变( Imuttable
)数值,那么在函数体内如果修改了该参数,那么参数就会重新指向另一个新的不可变值;如果您使用一个可变对象( Muttable
)作为默认参数,这个参数实际指向这个对象的指针,如果你改变它,您将会在未来所有对此函数的调用中改变这个对象。
def append_to(element, to=[]):
to.append(element)
return to
print(append_to.__defaults__) # => ([],)
my_list = append_to(12)
print(my_list, append_to.__defaults__) # => [12] ([12],)
my_other_list = append_to(42)
print(my_other_list, append_to.__defaults__) # => [12, 42] ([12, 42],)
避免上述情况,使用 None
作为默认参数值:
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to