ホームページ > バックエンド開発 > Python チュートリアル > For ループ内のラムダが最後の値のみを取得するのはなぜですか?

For ループ内のラムダが最後の値のみを取得するのはなぜですか?

Barbara Streisand
リリース: 2024-12-05 01:47:09
オリジナル
400 人が閲覧しました

Why Do Lambdas in For Loops Only Capture the Last Value?

For ループ内のラムダは最後の値のみをキャプチャします

for ループ内でラムダ関数を使用する場合、ローカルに関する動作を理解することが重要です変数のキャプチャ。デフォルトでは、ラムダは定義時にローカル変数の値をキャプチャします。ただし、これらの変数がループ内で変更された場合、ラムダは常に変数が受け取る最終値をキャプチャします。

コード サンプル:

次のコードを考えてみましょう:

options = ["INFO", "WARNING", "DEBUG"]

for i in range(len(options)):
    option = options[i]
    __cMenu.add_command(
        label="{}".format(option),
        command=lambda: self.filter_records(column, option)
    )
ログイン後にコピー

このコードは、複数のラムダを作成し、それぞれがオプション変数の異なる値を取得することを目的としています。ただし、これらのラムダが実行されると、オプションがループ内の最後の値である「DEBUG」に設定されているかのように動作します。

理由:

この現象は、関数の実行時にラムダの関数本体内の名前が評価されるために発生します。したがって、提供されたコードでは、各ラムダが呼び出されるときにオプション変数が評価され、オプションの最終値のみがキャプチャされます。

解決策:

この問題を回避するには、ラムダの定義時にオプションの値を取得する必要があります。これは、以下の変更されたコードに示すように、ラムダ内の新しい変数にオプションを割り当てることで実現できます。

options = ["INFO", "WARNING", "DEBUG"]

for i in range(len(options)):
    option = options[i]
    __cMenu.add_command(
        label="{}".format(option),
        command=lambda opt=option: self.filter_records(column, opt)
    )
ログイン後にコピー

ラムダ内で opt パラメータを使用すると、その時点でオプションの値が取得されます。ラムダが作成され、各ラムダが正しい値で動作することが保証されます。

以上がFor ループ内のラムダが最後の値のみを取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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