Python可变默认参数
示例
def foo(li=[]):
li.append(1)
print(li)
foo([2])
#出:[2,1]
foo([3])
#出:[3,1]该代码的行为符合预期,但是如果我们不传递参数怎么办?
foo() #出:[1]符合预期... foo() #出:[1,1]与预期不符...
这是因为函数和方法的默认参数是在定义时而不是运行时求值的。因此,我们只有一个li列表实例。
解决方法是对默认参数仅使用不可变类型:
def foo(li=None):
if not li:
li = []
li.append(1)
print(li)
foo()
#出:[1]
foo()
#出:[1]尽管改进并且可以ifnotli正确评估为False,但许多其他对象也可以这样做,例如零长度序列。以下示例参数可能会导致意外的结果:
x = [] foo(li=x) #出:[1] foo(li="") #出:[1] foo(li=0) #出:[1]
惯用的方法是直接检查None对象的参数:
def foo(li=None):
if li is None:
li = []
li.append(1)
print(li)
foo()
#出:[1]