当函数被定义时,Python的默认参数就被创建一次,而不是每次调用函数的时候创建。所有默认参数值则存储在函数对象的 __defaults__ 属性中,它的值为一个列表,列表中每一个元素均为一个默认参数的值。

  1. def add(x, y=1):
  2. return x + y
  3. print(add.__defaults__) # => (1,)

这意味着,如果参数的默认值是一个不可变( Imuttable )数值,那么在函数体内如果修改了该参数,那么参数就会重新指向另一个新的不可变值;如果您使用一个可变对象( Muttable )作为默认参数,这个参数实际指向这个对象的指针,如果你改变它,您将会在未来所有对此函数的调用中改变这个对象。

  1. def append_to(element, to=[]):
  2. to.append(element)
  3. return to
  4. print(append_to.__defaults__) # => ([],)
  5. my_list = append_to(12)
  6. print(my_list, append_to.__defaults__) # => [12] ([12],)
  7. my_other_list = append_to(42)
  8. print(my_other_list, append_to.__defaults__) # => [12, 42] ([12, 42],)

避免上述情况,使用 None 作为默认参数值:

  1. def append_to(element, to=None):
  2. if to is None:
  3. to = []
  4. to.append(element)
  5. return to

参考