首頁 >後端開發 >Python教學 >在循環中使用 Lambda 函數時,為什麼所有按鈕都會列印相同的索引?

在循環中使用 Lambda 函數時,為什麼所有按鈕都會列印相同的索引?

Patricia Arquette
Patricia Arquette原創
2024-10-26 18:26:29993瀏覽

Why Do All Buttons Print the Same Index When Using Lambda Functions in a Loop?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn