Python定义函数的时候,可以设定参数的默认值,如果调用时没有相应传入参数,python会将默认值带入到函数内部。
>> def test(a, b=2):
… print(a)
… print(b)
…
>>> test(10,20)
10
20
>>> test(10) #此例中,只传入一个参数,b默认为2
10
2
但是,如果默认参数为list,可能有时候表现的结果可能会出乎意料。看一下下面的例子,最终的结果会是什么。
def ListExtend(value, list=[]):
list.append(value)
return list
list1=ListExtend(4)
list2=ListExtend(‘abc’,[])
list3=ListExtend(‘m’)
print(list1)
print(list2)
print(list3)
运行结果:
[4, ‘m’]
[‘abc’]
[4, ‘m’]
你可能会想,list1不是应该是[4],list3不是应该是[‘m’]吗?难道不是每次调用默认参数list都应该重新初始化?
不是的。这涉及到python中针对函数默认参数的处理。当第一次不带参数调用ListExtend时候,python已经创建了一个新的list,当再次调用的时候,python不会重新创建list,而是继续使用之前创建的。因此,每一次不带参数调用都会在此list基础上进行append。