ホームページ  >  記事  >  バックエンド開発  >  Lambda クロージャが値ではなく名前をキャプチャするのはなぜですか?

Lambda クロージャが値ではなく名前をキャプチャするのはなぜですか?

DDD
DDDオリジナル
2024-10-21 13:15:30680ブラウズ

Why Do Lambda Closures Capture Names Instead of Values?

Python Lambda クロージャのスコープ

クロージャを使用して関数のシグネチャから変数を削除しようとすると、予期しない動作が発生する可能性があります。具体的には、別の関数内に囲まれていないラムダ関数は、すべてのインスタンスの変数の最後の値を返します。

この動作を理解するには、クロージャが値ではなく名前を取得することを認識することが重要です。ラムダを lambda x: test_fun(n, x) として定義すると、変数 n は関数内では評価されず、呼び出し時に評価されます。したがって、想定される値はループの最後の値です。

クロージャを使用して変数を効果的に「削除」するには、変数を引数として関数に渡す必要があります。これにより、変数の現在の値が関数に割り当てられ、事実上「ロックイン」されます。例:

<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]]  # Bad, captured value is last value
stuff = [lambda x, n=n: n+x for n in [1, 2, 3]]  # Good, n is locked in</code>

または、2 つのネストされた関数を使用できます:

<code class="python">def makeFunc(n):
    return lambda x: x+n

stuff = [makeFunc(n) for n in [1, 2, 3]]</code>

ここで、makeFunc 内のラムダは、グローバル変数ではなくローカル n 変数をキャプチャします。 makeFunc 呼び出しごとに新しいローカル変数が作成され、返されるラムダ関数が一意の n 値を持つことが保証されます。

最終的に、シンプルさと柔軟性のどちらを選択するかはあなた次第です。返された関数に追加の引数を追加したより単純な関数作成を選択することも、2 つのネストされた関数を含むより複雑な関数作成プロセスを使用したよりクリーンな関数を選択することもできます。

以上がLambda クロージャが値ではなく名前をキャプチャするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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