Lambda 関数のクロージャ キャプチャを理解する
プログラミングにおける簡潔で便利なツールである Lambda 関数を使用すると、匿名関数をクロージャに格納できます。 Python では、クロージャは外側のスコープをキャプチャして外部変数にアクセスしますが、この動作は時々驚くべきものになることがあります。
一連のラムダ関数がループ内で初期化され、特定の数値を追加するシナリオを考えてみましょう。彼らの意見。直感的には、これらの関数は作成時のループ変数の値を保持すると予想されるかもしれません。ただし、実際の結果は異なります。すべてのラムダ関数はループ変数の最終値をキャプチャします。
これは、Python のクロージャーが特定の変数やオブジェクトへの参照ではなく、外側のスコープをキャプチャするために発生します。言い換えれば、ラムダ関数は効果的にループ変数 i への参照を埋め込み、ループの進行につれて変化します。したがって、これらの関数のいずれかが呼び出されると、i の最終値が利用され、予期しない出力が発生します。
Lambda 関数での値のキャプチャの強制
これを回避するにはループ変数の意図した値を発行してキャプチャするには、デフォルト値を持つパラメーターを使用してキャプチャを強制する必要があります。変数をラムダ関数内のパラメータに割り当て、その意図した値のデフォルト値を指定することで、必要なキャプチャ動作を維持できます。
例:
# Initialize an array of lambda functions adders = [None, None, None, None] # Create lambda functions with forced capture of i for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # Call a lambda function with input print(adders[1](3)) # Output: 4
結論
ラムダ関数のキャプチャの仕組みを理解し、これを活用することでこの技術を使用すると、クロージャによってキャプチャされた値を制御して、コード実行時に望ましい動作を保証することができます。
以上がPython Lambda 関数がループ変数の最終値を取得するのはなぜですか? これはどのように修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。