ホームページ > バックエンド開発 > Python チュートリアル > Python Lambda が作成時ではなく呼び出し時にローカル参照にバインドされるのはなぜですか?

Python Lambda が作成時ではなく呼び出し時にローカル参照にバインドされるのはなぜですか?

DDD
リリース: 2024-10-29 21:41:29
オリジナル
464 人が閲覧しました

Why does Python Lambda bind to local references at invocation time, not creation time?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート