首頁  >  文章  >  後端開發  >  如何解決 Python Lambda 函數中的閉包作用域問題?

如何解決 Python Lambda 函數中的閉包作用域問題?

Barbara Streisand
Barbara Streisand原創
2024-10-21 12:59:02712瀏覽

How to Address Closure Scoping Issues in Python Lambda Functions?

了解 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中文網其他相關文章!

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