了解 Python Lambda 閉包作用域
在 Python 中使用閉包時,理解其作用域行為至關重要。在這種情況下,閉包不僅指 lambda 函數,還指從其封閉範圍存取變數的任何函數。
在給定的範例中:
<code class="python">names = ['a', 'b', 'c'] funcs1 = [gen_clousure(n) for n in names] funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
funcs2 傳回最後一個的原因所有案例的名稱都是由於閉包範圍而定。定義 lambda x: test_fun(n, x) 時,n 的值不會在定義期間計算並儲存在函數內,而是僅在呼叫時計算和儲存。因此,在呼叫函數時,n 包含循環中的最終值,導致姓氏被重複列印。
要解決此問題,必須確保閉包透過以下方式捕獲預期值將其作為函數的參數提供。在這種情況下,您需要將n 作為參數傳遞給lambda 函數,例如:
<code class="python">funcs2 = [lambda x, n=n: test_fun(n, x) for n in names]</code>
或者,您可以將lambda 函數封裝在另一個函數中:
<code class="python">def makeFunc(n): return lambda x: x+n stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
在這種情況下,內部lambda 引用封閉函數makeFunc 中的局部變數n,從而導致每個函數捕捉n 的正確值。
以上是如何解決 Python Lambda 函數中的閉包作用域問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!