循環中的Lambda 閉包和變數作用域
在循環中定義lambda 時,了解變數作用域的工作原理非常重要。在提供的程式碼片段中,循環內創建的每個 lambda 引用相同的變數 obj,該變數在每次迭代時都會修改。
預設範圍解析
預設情況下, lambda 將從封閉範圍捕獲變數。在給定的程式碼中,封閉範圍是循環區塊。因此,每個 lambda 有效地捕捉 obj 的最後一個值。從不同範圍呼叫 lambda 時,此行為可能會導致錯誤結果,因為它們可能沒有預期值。
捕獲局部變數
要解決此問題,您需要強制 lambda 捕獲 obj 的當前值。這可以透過在 lambda 中引入一個在創建時綁定到 obj 的新局部變數來實現。以下程式碼片段示範了這種方法:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda obj=obj: obj.some_var)
透過明確將 obj 作為參數傳遞給 lambda,我們為每個 lambda 建立一個新的局部變數。這確保每個 lambda 從循環迭代中捕獲 obj 的本地值。因此,當您從另一個範圍呼叫 lambda 時,它們將存取正確的值。
以上是如何捕捉循環內 lambda 閉包中的局部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!