防止循環中的Lambda 閉包混淆
在迭代物件清單的循環內建立lambda 時,重要的是要注意lambda 閉包行為。預設情況下,lambda 在定義時會捕獲封閉範圍內的變數。但是,如果變數在循環內發生更改,則稍後在循環中建立的 lambda 將引用更新的值。
考慮以下範例,其中我們建立lambda 來存取物件的some_var 屬性:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var)
如果我們隨後迭代lambda 清單並呼叫每個lambda,我們可能會為所有lambda 獲得相同的值。這是因為循環中創建的最後一個 lambda 將捕獲 obj 的最終狀態,並且該值將由所有 lambda 傳回。
為了解決這個問題,我們可以使用 lambda 指定要擷取的物件預設參數。這可確保每個 lambda 捕獲正確的物件參考:
lambdas_list.append(lambda obj=obj: obj.some_var)
透過使用此方法,每個 lambda 將捕獲它在創建時要引用的物件。這將防止混淆並確保 lambda 在循環中稍後調用時按預期運行。
以上是在循環中建立 Lambda 時如何防止 Lambda 閉包混亂?的詳細內容。更多資訊請關注PHP中文網其他相關文章!