在沒有變數閉包的循環內建立Lambda 表達式
在迭代物件清單的循環內建立Lambda 表達式時,重要的是防止變數閉包。當函數保留對其直接作用域之外的變數的存取權時,就會發生變數閉包。這可能會導致意外行為,例如所有 lambda 引用變數的相同最終值。
問題:
以下程式碼示範了該問題:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var) for f in lambdas_list: print(f())
呼叫此程式碼中的lambda 表達式時,所有lambda 表達式都會產生相同的結果:obj_list 中最後一個物件的obj.some_var 的值。這是因為 lambda 都引用同一個 obj 變量,該變量隨著循環的每次迭代而變化。
解:
為了防止變數閉包,我們可以使用語法 lambda x=x:其中 x 是我們要捕捉的變數。這會捕獲 obj 的副本並使其成為每個 lambda 的本機副本:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda obj=obj: obj.some_var) for f in lambdas_list: print(f())
現在,每個 lambda 將引用正確的 obj 並產生 obj.some_var 的預期值。
以上是在迴圈內建立 Lambda 時如何避免變數閉包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!