預設參數綁定異常
Python 的預設參數在函數定義而不是執行時綁定時,可能會讓程式設計師感到困惑。例如,考慮這個函數:
def foo(a=[]): a.append(5) return a
它在第一次呼叫時傳回一個包含單一元素 [5] 的清單。然而,後續呼叫會增加此元素計數,導致意外的模式:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5]
這種看似不合邏輯的行為源自於 Python 函數作為第一類物件的基本概念。在函數定義時,Python 將函數及其預設參數計算為函數物件的「成員資料」。因此,這些參數在函數呼叫中保留其狀態,就像常規類別屬性一樣。
定義時的這種綁定有一個明確的理由:它確保函數定義的所有方面都預先解決。如果在函數執行時執行綁定,則函數簽名將變得“混合”,部分綁定發生在定義時,一部分發生在呼叫時。這種不一致可能會帶來潛在的錯誤和混亂。
透過在定義時綁定預設參數,Python 維護了函數物件作為不可變實體的完整性。此行為為使用 Python 函數及其關聯的預設參數提供了一致且易於理解的框架。
以上是為什麼使用可變預設參數對 Python 函數的後續呼叫會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!