首頁 >後端開發 >Python教學 >為什麼 For 迴圈中的 Lambda 只會捕獲最後一個值?

為什麼 For 迴圈中的 Lambda 只會捕獲最後一個值?

Barbara Streisand
Barbara Streisand原創
2024-12-05 01:47:09438瀏覽

Why Do Lambdas in For Loops Only Capture the Last Value?

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

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