了解Lambda 函數中的閉包捕獲
Lambda 函數是一種簡潔方便的程式設計工具,允許將匿名函數儲存在閉包中。在 Python 中,閉包捕獲封閉範圍以獲取對外部變數的訪問,但這種行為有時可能會令人驚訝。
考慮這樣一個場景:在循環內初始化一組 lambda 函數以將特定數字添加到他們的意見中。直觀上,人們可能會期望這些函數在創建時保留循環變數的值。然而,實際結果是不同的 - 所有 lambda 函數都會捕獲循環變數的最終值。
發生這種情況是因為 Python 中的閉包捕獲封閉範圍,而不是對特定變數或物件的參考。換句話說,lambda 函數有效地嵌入了對循環變數 i 的引用,該變數隨著循環的進行而變化。因此,當呼叫任何這些函數時,它們都會利用 i 的最終值,從而導致意外輸出。
在Lambda 函數中強制執行值捕獲
要規避此問題發出並捕獲循環變數的預期值,因此有必要使用具有預設值的參數強制捕獲。透過將變數指派給 lambda 函數中的參數並提供其預期值的預設值,可以保留所需的擷取行為。
範例:
# Initialize an array of lambda functions adders = [None, None, None, None] # Create lambda functions with forced capture of i for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # Call a lambda function with input print(adders[1](3)) # Output: 4
結論
透過理解lambda 函數中的捕獲機制並利用透過透過透過透過透過理解這種技術,可以控制閉包捕獲的值,確保程式碼執行中的所需行為。
以上是為什麼 Python Lambda 函數會捕捉循環變數的最終值,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!