首頁 > 後端開發 > Python教學 > Python Lambda 函數閉包實際捕捉哪些變數?

Python Lambda 函數閉包實際捕捉哪些變數?

DDD
發布: 2024-12-29 06:55:14
原創
354 人瀏覽過

What Variables Do Python Lambda Function Closures Actually Capture?

Python Lambda 函數閉包捕獲什麼?

使用 Python lambda 函數閉包時,了解其捕獲行為非常重要。閉包從其封閉範圍捕獲閉包中使用的變數值。然而,這種捕獲發生的方式可能令人驚訝。

為了說明這一點,請考慮以下程式碼:

adders = [None, None, None, None]

for i in [0, 1, 2, 3]:
    adders[i] = lambda a: i + a

print(adders[1](3))
登入後複製

在此程式碼中,我們建立了一個lambda 函數列表,這些函數採用單一輸入並向其新增常數值。在函數建立期間,常數值最初設定為 i 的值。然而,當我們檢查閉包清單時,我們驚訝地發現它們都引用了 i 的最終值,導致意外輸出 6。

這種行為是由於閉包捕獲了 i 的值而導致的。變數而不是它的引用。因此,當閉包建立後 i 的值發生變化時,閉包將繼續引用最後捕獲的值。

捕獲當前值

捕獲i 的當前值,我們可以使用一種稱為「虛擬參數」技術的技巧。透過聲明一個與我們想要捕獲的變數同名的參數,並為其提供該變數的預設值,我們強制閉包捕獲當前值。

for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a  # <-- Note the dummy parameter with a default value

print(adders[1](3))  # Output: 4
登入後複製

透過此技術,閉包會擷取 i 在建立時的值,確保之後對 i 的變更不會影響閉包的行為。

以上是Python Lambda 函數閉包實際捕捉哪些變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板