ホームページ >バックエンド開発 >Python チュートリアル >Python Lambda 関数のクロージャ スコープの問題に対処する方法は?
Python Lambda クロージャのスコープを理解する
Python でクロージャを使用する場合、そのスコープ動作を理解することが重要です。このコンテキストでは、クロージャはラムダ関数だけでなく、それを囲むスコープから変数にアクセスする関数も指します。
指定された例では:
<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 にはループからの最終値が含まれており、その結果、姓が繰り返し出力されることになります。
この問題に対処するには、クロージャが次の方法で意図した値を確実に取得する必要があります。それを関数の引数として提供します。この場合、
<code class="python">funcs2 = [lambda x, n=n: test_fun(n, x) for n in names]</code>
のように n を引数としてラムダ関数に渡す必要があります。または、ラムダ関数を別の関数内にカプセル化することもできます:
<code class="python">def makeFunc(n): return lambda x: x+n stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
この場合、内部ラムダは、囲んでいる関数 makeFunc 内のローカル変数 n を参照し、その結果、各関数が n の正しい値を取得します。
以上がPython Lambda 関数のクロージャ スコープの問題に対処する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。