理解Python Lambda 函數中的閉包
原始問題:帶有索引打印的Lambda 閉包謎題
在程式設計中,閉包是指即使在封閉函數返回後也捕獲其封閉函數的變數的內部函數。這允許內部函數保留對變數的訪問,使它們在閉包的生命週期內持續存在。
lambda 表達式的一個常見用例是將變數綁定到函數。但是,如果在循環中使用(如提供的範例程式碼所示),lambda 函數可能會因閉包而表現出意外行為。
程式碼說明
在給定的程式碼中,在迴圈內建立五個按鈕。每個按鈕都指派一個 lambda 函數,該函數呼叫 makeId() 函數並列印索引 i。然而,當使用者點擊任意按鈕時,makeId()函數總是會列印5,這是i在循環中的最終值。
問題與解
出現這個問題是因為當執行 lambda 表達式時,它將變數 i 解析為其當時的值。由於此時循環已經終止,i 被解析為其最終值,即 5。
要解決此問題,必須修改 lambda 表達式以使用 lambda 參數明確指定 i 的正確值。預設情況下,lambda 使用封閉範圍的變量,但指定參數可確保在lambda 內創建具有所需值的局部變量:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
透過此修改,每個按鈕的lambda 函數都會捕獲正確的值循環中的i ,且makeId() 函數可以正確列印預期的索引。
附加說明
lambda 參數不需要具有相同的值name 作為封閉變數。它可以有任何名稱,確保在 lambda 範圍內捕獲正確的值。
以上是為什麼循環中的 Lambda 函數會捕捉最終索引值而不是循環迭代值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!