Python Lambda 函數和局部變數綁定
使用Python lambda 函數時,了解它們在引用局部變數方面的行為非常重要它們定義的範圍。下面的程式碼說明了這個問題:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
在這種情況下,我們期望看到 0 和 1 列印到控制台。然而,實際輸出列印 1 兩次。此行為源自於 Python lambda 綁定到局部變數的方式。
陷阱:早期綁定
Python lambda 在呼叫時不會綁定到局部變數的引用被創建了。相反,它們綁定到該特定時間點的變數值。因此,當呼叫 lambda 時,它會存取變數的當前值,而不是創建時可用的值。
解決方案:使用預設參數進行後期綁定
要將局部變數綁定到 lambda 函數並保留其正確引用,我們可以使用後期綁定。這是透過向 lambda 函數傳遞預設參數來實現的,如下所示:
<code class="python">x.append(lambda v=v: pv(v))</code>
透過此更改,lambda 將在建立 lambda 時綁定到 v 的值,而不是在呼叫它時。因此,當我們迭代列表 x 並呼叫每個 lambda 函數時,我們將獲得預期的輸出 0 和 1。
理解早期綁定
進一步澄清這個概念,請考慮以下示例:
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
此程式碼將“定義foo 後”列印到控制台,演示變數是在函數呼叫時綁定的,而不是在創建時。
以上是為什麼 Python Lambda 綁定到局部變數的值,而不是引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!