Python Lambda 関数とローカル変数バインディング
Python ラムダ関数を使用する場合、内部のローカル変数への参照に関する動作を理解することが重要です。定義されている範囲。次のコードは、この問題を示しています。
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
このシナリオでは、コンソールに 0 と 1 が出力されることが予想されます。ただし、実際の出力では 1 が 2 回出力されます。この動作は、Python ラムダがローカル変数にバインドする方法に起因します。
落とし穴: 早期バインディング
Python ラムダは、ローカル変数の参照にバインドされません。が作成されました。代わりに、それらはその特定の時点での変数の値にバインドされます。その結果、ラムダが呼び出されると、作成時に使用可能な値ではなく、変数の現在の値にアクセスします。
解決策: デフォルトの引数を使用した遅延バインディング
ローカル変数をラムダ関数にバインドし、その正しい参照を保持するには、遅延バインディングを使用できます。これは、以下に示すように、デフォルトの引数をラムダ関数に渡すことによって実現されます。
<code class="python">x.append(lambda v=v: pv(v))</code>
この変更により、ラムダは、ラムダが呼び出されたときではなく、作成されたときに v の値にバインドされます。したがって、リスト x を反復処理して各ラムダ関数を呼び出すと、期待される出力 0 と 1 が得られます。
アーリー バインディングについて
さらに詳しくこの概念を明確にするために、次の例を考えてみましょう。
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
このコード スニペットは、「foo が定義された後」をコンソールに出力し、変数が作成時ではなく関数呼び出し時にバインドされていることを示しています。
以上がPython ラムダが参照ではなくローカル変数の値にバインドされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。