ローカル値を使用した Python ラムダ バインディングを理解する
Python でラムダ関数を操作する場合、ローカル変数とどのように対話するかを理解することが重要です。特に複数のラムダが同じ変数を参照する場合はそうです。
次の例を考えてみましょう:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) # Lambda binds to the reference of 'v' for xx in x: xx() # Prints 1 twice</code>
最初は、リスト 'x' 内のラムダ関数が現在の 'v' を参照すると予想されるかもしれません。作成当時。ただし、これは Python の仕組みではありません。代わりに、Python は関数呼び出し時に変数名を評価し、両方のラムダが「v」の最終値 (1) を参照するようにします。
目的の動作を実現するには (0 を出力し、次に 1 を出力します) )、Python のデフォルト引数メカニズムを利用できます:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda v=v: pv(v)) # Lambda binds to the copy of 'v' at creation time for xx in x: xx() # Prints 0 and then 1</code>
「v」のデフォルト引数を設定すると、ラムダ関数は作成時に作成された「v」のローカル コピーにバインドされます。後で使用するときに正しい参照が保持されるようにします。
Python は変数名を作成時ではなく関数呼び出し時に検索することに注意してください。この原則は、次の例で示すように、ラムダだけでなく通常の関数にも当てはまります:
<code class="python">x = "before foo defined" def foo(): print(x) # Prints "after foo was defined" x = "after foo was defined" foo()</code>
以上がPython Lambda 関数はローカル変数参照をどのように処理し、いつ評価されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。