Python Lambda 関数クロージャは何をキャプチャしますか?
Python ラムダ関数クロージャを使用する場合、そのキャプチャ動作を理解することが重要です。クロージャは、クロージャ内で使用される変数の値を、それを囲んでいるスコープからキャプチャします。ただし、このキャプチャが行われる方法は驚くべきものになる可能性があります。
これを説明するために、次のコードを考えてみましょう。
adders = [None, None, None, None] for i in [0, 1, 2, 3]: adders[i] = lambda a: i + a print(adders[1](3))
このコードでは、次のラムダ関数のリストを作成します。単一の入力に定数値を追加します。定数値は、関数の作成時に最初に i の値に設定されます。しかし、クロージャのリストを検査すると、驚くべきことに、それらはすべて i の最終値を参照しており、予期しない出力 6 が得られることがわかります。
この動作は、クロージャが i の値をキャプチャするという事実から生じます。参照ではなく変数。その結果、クロージャの作成後に i の値が変更された場合、クロージャは最後にキャプチャされた値を参照し続けます。
現在の値のキャプチャ
i の現在値を調べるには、「ダミー パラメーター」テクニックとして知られるトリックを使用できます。キャプチャしたい変数と同じ名前のパラメータを宣言し、その変数のデフォルト値を指定することで、クロージャに現在の値を強制的にキャプチャさせます。
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # <-- Note the dummy parameter with a default value print(adders[1](3)) # Output: 4
この手法では、クロージャは作成時に i の値をキャプチャし、その後の i への変更がクロージャの動作に影響を与えないようにします。
以上がPython Lambda 関数クロージャは実際にどのような変数をキャプチャしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。