首頁 >後端開發 >Python教學 >為什麼 Python 的可變預設參數行為看起來如此令人驚訝?

為什麼 Python 的可變預設參數行為看起來如此令人驚訝?

Susan Sarandon
Susan Sarandon原創
2024-12-24 08:46:20862瀏覽

Why Does Python's Mutable Default Argument Behavior Seem So Surprising?

「最不令人驚訝」和可變預設參數

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn