標籤:函數 入參 就會 16px com table family 預設 style
在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
Python中list作為預設參數的陷阱