Python中list作為預設參數的陷阱

來源:互聯網
上載者:User

標籤:函數   入參   就會   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作為預設參數的陷阱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.