在 Lambda 函數中捕獲變數:閉包
在 lambda 函數中,從封閉範圍捕獲變數是一個常見問題。預設情況下,lambda 函數會引用其封閉範圍內的變數。然而,這些引用的解析發生在執行時,而不是定義期間。
考慮這個程式碼片段,其中我們使用循環創建五個按鈕,並將命令綁定到每個按鈕以使用lambda 函數:
<code class="python">for i in range(5): make_button = Tkinter.Button(frame, text ="make!", command= lambda: makeId(i))</code>
您可能期望此程式碼將列印所單擊按鈕的索引。但是,它總是列印“5”,因為 i 的值是在循環結束時捕獲的,即 i 遞增到 5 之後。
解決方案:使用閉包
為了解決這個問題,我們可以使用閉包。閉包是一個函數,它從其封閉範圍捕獲變數並在定義時初始化它們。這使我們能夠捕獲每個按鈕的正確 i 值。
<code class="python">make_button = Tkinter.Button(frame, text ="make!", command= lambda i=i: makeId(i))</code>
透過在 lambda 函數中分配 i=i,我們建立一個局部變量,該變數使用循環中 i 的當前值進行初始化。這確保每個按鈕都有自己對其預期索引的引用。
以上是為什麼我的 Lambda 函數總是列印「5」?在 Python 中捕捉變數的指南。的詳細內容。更多資訊請關注PHP中文網其他相關文章!