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

cf2c74d80498d95f48f9d3e4595d9e0b0be.jpg

絕大多數狀況下,Python是一個乾淨具備一致性的語言。然而,有些少數狀況會讓初學者感到困惑。其中有些狀況是有意識的但會成爲潛在的莫名其妙,而有些能夠說是語言贅肉。下面咱們看看使用可變默認參數(Mutable default arguments)時會出現什麼莫名其妙的情況。app

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

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將會生成,因此輸出應該是:spa

[12]
[42]

可是,結果並不是上面那樣,而是下面這樣:code

[12]
[12, 42]

當該函數被定義時,一次性生成一個list做爲默認參數,後面每次成功調用都是使用的第一次生成的那個list。對象

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

正確的作法應該是:get

讓默認參數爲None(None一般是一個很好的選擇),每次調用時建立一個新對象。博客

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

同時也有注意,該函數要傳遞一個list對象做爲第二個參數,由於函數中對它進行了append操做。it

文章都是我過往經驗總結,我在個人博客:https://www.yuanrenxue.com/ 和 公衆號【猿人學Python】 上會分享更多心得體會。

相關文章
相關標籤/搜索