在python中,用默認參數(list,set,dict...)時要小心


 

在我們平時寫需求的時候,如果沒有了解到以下知識點,可能會出現這樣的問題,掉進坑里面,甚至很難找到問題的根源。
下面我們來看看使用可變默認參數(Mutable default arguments)時會出現什么詭異的情況。

你可能寫了以下函數,它有一個默認參數是一個list:

def append_to(element, to=[]):
    to.append(element)
    return to

然后調用該函數:

my_list = append_to(12)
print(my_list)

my_other_list = append_to(42)
print(my_other_list)

 

每次調用該函數,如果第二個參數沒有提供(使用默認參數),一個新的list將會生成,所以輸出應該是:

[12]
[42]

 

但是,結果並非上面那樣,而是下面這樣:

[12]
[12, 42]

 

當該函數被定義時,一次性生成一個list作為默認參數,后面每次成功調用都是使用的第一次生成的那個list。

Python的默認參數只在函數被定義時生成一次,而非每次調用時生成。這就意味着如果你使用可變默認參數並改變它,所有調用該函數的結果都是這個可變對象。

 

正確的做法應該是:

讓默認參數為None(None通常是一個很好的選擇),每次調用時創建一個新對象。

def append_to(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to

同時也有注意,該函數要傳遞一個list對象作為第二個參數,因為函數中對它進行了append操作。

 

 

文章首發於我的技術博客猿人學Python基礎教程

 


免責聲明!

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



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