Python Lambda のローカル参照へのバインディング
次のコードは、'0' と '1' の代わりに '1' を 2 回出力します。
<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>
この動作を理解するには、Python ラムダがローカル変数とどのように対話するかを理解することが重要です。予想に反して、ラムダは作成時に本質的にローカル変数の参照にバインドされません。代わりに、それらは呼び出し時に取得された変数の値にバインドされます。
この問題を修正し、ローカル変数をラムダ関数に正しくバインドするには、ラムダのデフォルト引数を使用する必要があります。ラムダ定義内で変数のデフォルト値を設定すると (例: lambda v=v: pv(v))、ラムダは作成時の変数の値を参照します。
この動作は次のとおりです。ラムダに限定されたものではありません。次の例を考えてみましょう:
<code class="python">x = "before foo defined" def foo(): print x x = "after foo was defined" foo()</code>
Python は関数の作成時ではなく、関数の呼び出し時に x の値を検索するため、このコードの出力は「foo が定義された後」になります。 .
以上がPython Lambda が作成時ではなく呼び出し時にローカル参照にバインドされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。