次のコードでは、
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」に設定されているかのように動作します。
この問題は、関数本体内の名前の評価タイミングが原因で発生します。 。提供されたコードでは、関数の実行時に名前が評価されます。その結果、ループ内で作成されたラムダはすべて、実行時に同じオプションの値、つまり「DEBUG」を参照します。
この問題を回避するには、次の変更を行うことができます:
__cMenu.add_command(label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt))
option=option をラムダ関数の引数として導入することにより、各ラムダは、オプションに依存するのではなく、作成時にオプションの正しい値を取得します。実行時の値。これにより、各ラムダがオプションの目的の値に基づいて動作することが保証されます。
以上がFor ループ内のラムダが最後の値のみを使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。