Python对默认参数值的处理是可以困扰大多数新Python程序员的几件事之一。
导致问题的原因是使用“可变”对象作为默认值。也就是说,可以就地修改的值,例如列表或字典。
如果未提供第二个参数,则每次调用该函数时都会创建一个新列表,因此EXPECTED OUTPUT为:
[12] [43]
定义函数后,将创建一个新列表,并且在每个后续调用中都使用相同的列表。
定义函数时,Python的默认参数只计算一次,而不是每次调用函数时才计算。这意味着,如果您使用可变的默认参数并对其进行了突变,那么您将来也将对该对象也进行了突变,以供将来对函数的所有调用。
我们应该怎么做
每次调用该函数时,都要使用默认的arg来表示未提供任何参数,从而创建一个新对象(通常不选择它是一个不错的选择)。
def func(data=[]): data.append(1) return data func() func() def append2(element, foo=None): if foo is None: foo = [] foo.append(element) return foo print(append2(12)) print(append2(43))
输出结果
[12] [43]