默认参数只在模块加载时求值一次。
如果参数是列表或字典之类的可变类型,可能会导致问题,即如果函数修改了对象(例如向列表追加项),默认值就被修改了。
代码示例:
def func(a, b=[]):
a += 1
b.append(1)
return a, b
print(func(0))
print(func(1))
print(func(1, []))
输出:
(1, [1])
(2, [1, 1])
(2, [1])
结论:
不要在函数或方法定义中使用可变对象作为默认值。
替代方案:使用 None,在函数或方法中判断 if var is None
代码示例:
def func(a, b=None):
a += 1
if b is None:
b = []
b.append(1)
return a, b
print(func(0))
print(func(1))
print(func(1, []))
输出:
(1, [1])
(2, [1])
(2, [])
参考资料: