1. 程式人生 > >python預設引數的坑以及最佳實踐

python預設引數的坑以及最佳實踐

// An example
def addEnd(L=[]):
    L.append("end")
    return L
print addEnd()#["end"]
print addEnd()#["end", "end"]坑!!!對一切的列表有記憶了,不是我們想要的

print的結果和想象中不同, 從上述呼叫結果發現,函式每次都記住了上次添加了‘END’後的list,python函式在定義的時候,預設引數L的值就被計算出來了即[],因為預設引數L也是一個變數,它指向物件[],每次呼叫該函式,如果改變 了L的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的[]了。
預設引數一定要是不可變引數


最佳實踐:當要傳入可變引數物件時,可用None

def addEnd2(L=None):
    if L is None:
        L = []
    L.append("end")
    return L