當心Python函數可變默認參數(list,set,dict…)的陷阱

當心Python函數可變默認參數(list,set,dict…)的陷阱

絕大多數情況下,Python是一個乾淨具有一致性的語言。然而,有些少數情況會讓初學者感到困惑。其中有些情況是有意識的但會成為潛在的莫名其妙,而有些可以說是語言贅肉。下面我們看看使用可變默認參數(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)
A new list is created each time the function is called if a second argument isn’t provided, so that the output is:

每次調用該函數,如果第二個參數沒有提供(使用默認參數),一個新的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感興趣,這裡推薦一下我的學習交流圈:556370268,裡面都是學習python的,從最基礎的python【python,遊戲,黑客技術,網絡安全,數據挖掘,爬蟲】到網絡安全的項目實戰的學習資料都有整理,送給每一位python小夥伴,希望能幫助你更瞭解python,學習python

當心Python函數可變默認參數(list,set,dict…)的陷阱


分享到:


相關文章: