Python坑之——默認參數必須指向不變對象

原文地址:廖雪峯的Python教程——函數的參數


先定義一個函數,傳入一個list,添加一個END再返回:

def add_end(L=[]):
    L.append('END')
    return L

當你正常調用時,結果似乎不錯:

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

當你使用默認參數調用時,一開始結果也是對的:

>>> add_end()
['END']

但是,再次調用add_end()時,結果就不對了:

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

默認參數是[],但是函數似乎每次都“記住了”上次添加了'END'後的list。


原因解釋如下:

Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因爲默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,不再是函數定義時的[]了。

所以,定義默認參數要牢記一點:默認參數必須指向不變對象!

要修改上面的例子,我們可以用None這個不變對象來實現:

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L

現在,無論調用多少次,都不會有問題:

>>> add_end()
['END']
>>> add_end()
['END']
發佈了38 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章