首頁  >  文章  >  後端開發  >  在迴圈內建​​立 Lambda 時如何避免變數閉包?

在迴圈內建​​立 Lambda 時如何避免變數閉包?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 14:31:03558瀏覽

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

在沒有變數閉包的循環內建立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中文網其他相關文章!

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