在Python中,作為默認參數的一定要是不可變對象,如果是可變對象,就會出現問題,稍不注意,就會調入陷阱,尤其是初學者,比如我(┬_┬)。
我們來看一個例子。
1 def add(L=[]): 2 L.append(1) 3 return L 4 5 L = [1, 2, 3] 6 newL = add(L) 7 print(newL) 8 newL = add(newL) 9 print(newL) 10 11 testL = add() 12 print(testL) 13 testL = add() 14 print(testL) 15 testL = add() 16 print(testL)
運行結果如圖:
在正常傳入參數的時候,好像沒什么大問題。但是當我們使用默認參數的時候,問題出現了。
運行結果沒有按我們的預期出現。原因何在?
當我們調用函數時,如果有傳遞參數,則使用傳遞的參數,如果沒有傳遞參數,就使用默認參數。而使用默認參數的時候,使用的是同一個,也就是保存的上一個默認參數值。我們可以通過打印id來驗證一下。
因此,默認參數一定要是不可變對象,如果是可變對象的話,就會出現上述情況。
那么如何解決呢?
我們可以讓L先指向None這個不可變變量,然后增加一個判斷,讓默認參數重新歸位即可。
1 def add(L=None): 2 if(L == None): 3 L = [] 4 L.append(1) 5 return L 6 7 L = [1, 2, 3] 8 newL = add(L) 9 print(newL) 10 newL = add(newL) 11 print(newL) 12 13 testL = add() 14 print(testL) 15 testL = add() 16 print(testL) 17 testL = add() 18 print(testL)
這樣子,我們就解決了這個陷阱,那么下次就不應該再掉進去了,你說是不是?
牢記:默認參數要使用不可變對象!!!
不可變(immutable):int、string、float、number、tuple
可變(mutable):dictionary、list、set