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