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