Python 中的 Lambda 閉包
在 Python 中,lambda 函數建立閉包,允許存取其範圍之外的變數。但是,在循環中使用時,此行為可能會導致意外結果。
問題陳述
考慮以下程式碼,其中使用循環創建了五個按鈕。每個按鈕都綁定一個命令來列印其索引:
<code class="python">for i in range(5): make_button = Tkinter.Button(frame, text ="make!", command= lambda: makeId(i))</code>
行為
點擊時,所有按鈕都會列印相同的索引,始終為5 。發生這種情況的原因是lambda 中的變數解析發生在執行時。單擊按鈕時,循環已結束,所有按鈕的 i 都等於 5。
解決方案
要解決此問題,我們需要在每個 lambda 中建立捕獲 i 的正確值的局部變數。這可以透過將 i 作為參數傳遞給 lambda 來實現,如下所示:
<code class="python">make_button = Tkinter.Button(frame, text ="make!", command= lambda i=i: makeId(i))</code>
這會為每個 lambda 建立一個局部 i 變量,該變數保留循環迭代中 i 的值。透過這樣做,我們確保每個按鈕列印預期的索引。
以上是在循環中使用 Lambda 函數時,為什麼所有按鈕都會列印相同的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!