Python中list作為默認參數的陷阱


  在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM