Python:預設參數

來源:互聯網
上載者:User

標籤:

Python是個人最喜歡的語言,剛開始接觸Python時,總覺得有很多槽點,不太喜歡。後來,不知不覺中,就用的多了、習慣了、喜歡上了。Python的功能真的很強大,自己當初學習這門語言的時候,也記錄過很多的筆記,現慢慢把這些筆記發布出來,希望對大家有所協助,對自己也算是一個總結。

關於Python預設參數,假如預設參數是可變對象是會有副作用的,這一點我一開始不是很理解,直到有一天,看到一篇博文說:一個函數參數的預設值,僅僅在該函數定義的時候,被賦值一次。如此,只有當函數第一次被定義的時候,才講參數的預設值初始化到它的預設值(如一個空的列表)。
聽到這個解釋,豁然開朗,解譯器實驗如下:

 1 >>> def f(x = []): 2     print(id(x)) 3     x.append(1) 4     print x 5     print(id(x)) 6  7      8 >>> f()  9 38869952 # 可變預設參數是在原地更改!!!10 3886995211 >>> f()12 38869952 # 再次調用時,可變預設參數還是引用最初定義的!!!13 3886995214 # 注意,預設參數是在定義時賦值,且僅僅賦值一次。15 # 當函數多次被調用,並且沒有提供預設的參數值,就會從定義時賦值的地方取得值!16 # 即使函數中給預設參數重新賦值了,下次調用還是會從定義賦值的地方取得值!17 # 如以下的樣本:當f2()多次調用,雖然在函數體裡面給y重新賦值了,但是下次調用時18 # 再次列印print id(x) 的結果也還是一樣的!19 # 所以:20 # 1. 假如預設參數是可變對象,則會在原處直接更改對象,下次調用參數時,預設參數已經21 # 更改過的了。如f()函數。22 # 2. 假如預設參數不可變,那麼給函數中給 參數賦值時,參數會引用記憶體的其他地方。下次函數調用時23 # 預設參數還是從定義時賦值處取得值,因此沒有副作用!24 >>> def f2(y = None):25     print(id(y))26     if not y:27         y = []28     y.append(1)29     print(id(y))30 31     32 >>> f2()33 505672708   # 定義時預設參數引用這一塊記憶體。34 38888872    # 函數體內賦值後,y引用其他地方。35 >>> f2()36 505672708    # 再次調用,y還是引用定義時賦值的記憶體處。37 43910728     # 函數體內賦值後,y引用其他地方。38 >>> f()39 38869952 40 3886995241 >>> f2()42 50567270843 4390940844 >>> f2()45 50567270846 3886875247 >>>

 

Python:預設參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.