摘要:下面我們看看使用可變默認參數(shù)時會出現(xiàn)什么莫名其妙的狀況。這就意味著如果你使用可變默認參數(shù)并改變它,所有調用該函數(shù)的結果都是這個可變對象。同時也有注意,該函數(shù)要傳遞一個對象作為第二個參數(shù),因為函數(shù)中對它進行了操作。
絕大多數(shù)情況下,Python是一個干凈具有一致性的語言。然而,有些少數(shù)情況會讓初學者感到困惑。其中有些情況是有意識的但會成為潛在的莫名其妙,而有些可以說是語言贅肉。下面我們看看使用可變默認參數(shù)(Mutable default arguments)時會出現(xiàn)什么莫名其妙的狀況。
你可能寫了以下函數(shù),它有一個默認參數(shù)是一個list:
def append_to(element, to=[]): to.append(element) return to
然后調用該函數(shù):
my_list = append_to(12) print(my_list) my_other_list = append_to(42) print(my_other_list) A new list is created each time the function is called if a second argument isn’t provided, so that the output is:
每次調用該函數(shù),如果第二個參數(shù)沒有提供(使用默認參數(shù)),一個新的list將會生成,所以輸出應該是:
[12] [42]
但是,結果并非上面那樣,而是下面這樣:
[12] [12, 42]
當該函數(shù)被定義時,一次性生成一個list作為默認參數(shù),后面每次成功調用都是使用的第一次生成的那個list。
Python的默認參數(shù)只在函數(shù)被定義時生成一次,而非每次調用時生成。這就意味著如果你使用可變默認參數(shù)并改變它,所有調用該函數(shù)的結果都是這個可變對象。
正確的做法應該是:
讓默認參數(shù)為None(None通常是一個很好的選擇),每次調用時創(chuàng)建一個新對象。
def append_to(element, to=None): if to is None: to = [] to.append(element) return to
同時也有注意,該函數(shù)要傳遞一個list對象作為第二個參數(shù),因為函數(shù)中對它進行了append操作。
文章都是我過往經驗總結,我在我的博客:https://www.yuanrenxue.com/ 和 公眾號【猿人學Python】 上會分享更多心得體會。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43644.html
摘要:如果一個對象定義了和兩個方法,它就是一個迭代器,對于迭代器來說,返回的是它自身,則是返回迭代器中的下一個值。 復習索引: 1. dict與list的區(qū)別是什么?查找方面 2. dict如何進行數(shù)據(jù)的存、取、判斷是否存在、返回位置、刪除等操作? 3. 什么是不可變對象?在dict和set中如何應用? 4. dict和set有什么異同? 5. range(),abx()函數(shù)如何使用?參數(shù)是...
摘要:調用函數(shù)時,必須傳入且傳入的兩個值按照位置順序依次賦給參數(shù)和,若缺省,則會報錯。例如二默認參數(shù)在函數(shù)定義中,為參數(shù)預先定義默認值。執(zhí)行相當于調用如果要求的四次方,則需要執(zhí)行設置默認參數(shù)的好處默認參數(shù)可以簡化函數(shù)的調用,降低調用函數(shù)的難度。 題外話:因為時間關系,沒能保持一定的更新頻率。但還是會一直堅持的~ 之前介紹了Python函數(shù)的定義,今天分享一下Python函數(shù)的參數(shù)吧!內容會...
摘要:一對象引用基礎知識變量是標注而不是容器。也就是說元組中不可變的是元素的標識,但元組的值會隨著引用的可變對象變化而變化。在中每個對象的引用都會有統(tǒng)計。弱引用不會妨礙對象被當做垃圾回收。 導語:本文章記錄了本人在學習Python基礎之面向對象篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、明確變量保存的是引用這一本質;2、熟悉對象引用的基礎知識;...
閱讀 3828·2021-10-08 10:12
閱讀 4326·2021-09-02 15:40
閱讀 936·2021-09-01 11:09
閱讀 1605·2021-08-31 09:38
閱讀 2543·2019-08-30 13:54
閱讀 2249·2019-08-30 12:54
閱讀 1244·2019-08-30 11:18
閱讀 1400·2019-08-29 14:06