「最不令人驚訝」和可變預設參數
Python 使用可變預設參數的令人驚訝的行為讓無數開發人員感到困惑。考慮以下情況:
def foo(a=[]): a.append(5) return a
直觀上,人們可能期望在不帶參數呼叫時此函數始終傳回僅包含 [5] 的清單。然而,這個假設被實際的輸出打破了:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
那麼,這是怎麼回事?
關鍵在於Python的一流函數物件。定義函數後,會立即求值,包括預設參數的求值。對於 foo,a 的預設值被計算為空列表。然而,這個列表儲存在函數物件本身中,使其對於後續呼叫是可變的。
與 C 等語言不同,Python 中的函數參數不是在編譯時評估的靜態變數。相反,它們綁定到可能隨時間變化的物件。函數物件中「成員資料」的概念解釋了我們透過可變預設參數觀察到的驚人行為。
正如effbot 在Python 中的預設參數值中指出的那樣,這種行為是合乎邏輯的,並且與其他物件的工作方式一致:
「任何物件都可以將其狀態從一個呼叫更改為另一個呼叫。物件導向的本質和可變物件行為的期望保持一致。
以上是為什麼 Python 的可變預設參數行為看起來如此令人驚訝?的詳細內容。更多資訊請關注PHP中文網其他相關文章!