python函数默认参数的坑

当函数的默认参数为可变对象的时候,比如list,dict,往往会出错误。

exmaple:
 
def fun(val,list=[]):
    list.append(val)
    return list
 
fun1 = fun(10,[1])
fun2 = fun(11,[])
fun3 = fun('a')
fun4 = fun('b')
 
print(fun1)
print(fun2)
print(fun3)
print(fun4)
 
输出结果为:
[1, 10]
[11]
['a', 'b']
['a', 'b']
因为函数在运行前,默认参数值被定义时,已经计算出来,如果不改变,就会调用定义时的默认值,然后依次累加。
所以fun3和fun4的值是相等的 ,id也是相等的。
example:
上面的函数,假如:
fun1 = fun(10)
fun2 = fun(11,[])
fun3 = fun('a')
fun4 = fun('b')
 
输出:
[10, 'a', 'b']
[11]
[10, 'a', 'b']
[10, 'a', 'b']
可见,在fun2的时候,函数的默认值依然是list=[10],但因为fun2传入的是[],所以结果产生变化。但fun3和fun4中没有新的list参数传入,启用默认值,并累加。到fun3时,fun1和fun3会输出,[10,'a'];到fun4时,三个值都输出[10, 'a', 'b']。
posted @ 2019-07-02 10:46  Mana66ccff  阅读(139)  评论(0)    收藏  举报