ホームページ >バックエンド開発 >Python チュートリアル >Python Lambda 関数が参照ではなく値をキャプチャするのはなぜですか?これはどのように解決できるのでしょうか?
Lambda 関数のクロージャ キャプチャについて
Python クロージャは、それが定義されている外側のスコープの状態をキャプチャします。具体的には、ラムダ関数内で参照されている、スコープ内に存在しない変数の値をキャプチャします。
この例では、ラムダ関数は変数 i をキャプチャし、ループの実行時に異なる値が割り当てられます。ただし、ラムダ関数は、i が指すオブジェクトへの参照をキャプチャしません。代わりに、作成時に i の値を取得します。
この動作は、adders[1](3) を呼び出したときの 6 という予期せぬ結果を説明しています。整数オブジェクトへの参照が期待されているにもかかわらず、ラムダ関数は i に割り当てられる最終値である値 3 を取得します。
各ラムダ関数で i の現在の値を保持するという望ましい動作を実現するには、引数のデフォルトと呼ばれる手法を使用できます。ラムダ関数にデフォルトの引数を指定すると、作成時の i の値がロックされます。 例:
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i+a
この場合、パラメータ i のデフォルト値は現在の値に設定されます。 iの値。ラムダ関数が呼び出されると、作成時にキャプチャされた i の値が使用されます。
このメソッドにより、adders 配列内の各ラムダ関数が意図した i の値をキャプチャし、期待される値を生成できるようになります。呼び出し時の出力。
以上がPython Lambda 関数が参照ではなく値をキャプチャするのはなぜですか?これはどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。