ホームページ >バックエンド開発 >Python チュートリアル >Python Lambda 関数のクロージャ スコープの問題に対処する方法は?

Python Lambda 関数のクロージャ スコープの問題に対処する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-21 12:59:02719ブラウズ

How to Address Closure Scoping Issues in Python Lambda Functions?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。