了解Lambda 中的閉包:解析變數
在這種情況下,您嘗試在循環中建立多個按鈕,每個按鈕按鈕觸發列印特定索引值的命令。但是,您遇到了一個問題,即按鈕的命令始終列印相同的索引“5”。
此行為源自於 lambda 中閉包的性質。定義 lambda 時,它會捕獲封閉範圍的變數並在執行時引用它們。在你的例子中,封閉範圍是循環,其中變數 i 代表目前索引。
不幸的是,當執行 lambda 時(按下按鈕時),i 的值已經達到了最後一個迭代並且對於所有按鈕都等於「5」。這是因為捕獲的變數 i 是對相同記憶體位置的引用,並且它所保存的值會隨著循環的進行而更新。
要解決此問題,您需要建立一個捕獲正確值的閉包每個按鈕的 i 。您可以透過為 lambda 函數中的 i 參數提供預設值來實現此目的。例如:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
透過提供 i=i 作為 lambda 參數的預設值,您將建立一個局部變數 i,它保存每個按鈕的正確索引值。當按下按鈕時,lambda 函數將使用捕獲的局部變數 i 執行,並列印正確的索引。
以上是為什麼我的按鈕命令總是在帶有 Lambda 的循環中列印相同的索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!