默认参数值的陷阱
默认参数值在函数定义的时候并得到计算,如下:
i = 5 def f(arg=i): print(arg) i = 6 f()
最后输出的结果为5,因为默认值已在函数定义时得到计算。
重要警告:默认值仅被计算一次。 当默认值是可变对象(例如列表,字典或大多数类的实例)时,这会有所不同。 例如,以下函数累积在后续调用中传递给它的参数:
def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3))
这段代码将输出:
[1] [1, 2] [1, 2, 3]
这是因为L的默认值在定义时为[],且只会计算一次,当多次调用该函数时,L的默认值不会重新计算为[],而是原先的list对象,又因为list对象为可变类型。
如果不希望在后续调用之间共享默认参数值,则可以编写如下函数:
def f(a, L=None): if L is None: L = [] L.append(a) return L