For 循環中的Lambda 僅捕獲最後一個值
在for 循環中使用lambda 函數時,了解其關於本地的行為至關重要變數捕獲。預設情況下,lambda 會擷取定義 lambda 時的局部變數的值。但是,如果這些變數在循環內發生變化,則 lambda 將始終捕獲它們所採用的最終值。
程式碼範例:
考慮以下程式碼:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda: self.filter_records(column, option) )
此程式碼旨在建立多個lambda,每個lambda 擷取選項變數的不同值。但是,當執行這些 lambda 時,它們的行為就好像選項設定為“DEBUG”,也就是它在迴圈中採用的最後一個值。
原因:
出現此行為是因為執行函數時會計算 lambda 函數體內的名稱。因此,在提供的程式碼中,在呼叫每個 lambda 時都會評估 option 變量,從而僅捕獲 option 的最終值。
解決方案:
為了避免這個問題,有必要在定義 lambda 時捕獲 option 的值。這可以透過將option 分配給lambda 中的新變數來實現,如下面修改後的程式碼所示:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt) )
透過在lambda 中使用opt 參數,當時會捕獲option 的值來建立lambda,確保每個lambda 使用正確的值進行操作。
以上是為什麼 For 迴圈中的 Lambda 只會捕獲最後一個值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!