ホームページ  >  記事  >  バックエンド開発  >  ループ内でラムダを使用すると、すべてのボタンが同じインデックスを出力するのはなぜですか?

ループ内でラムダを使用すると、すべてのボタンが同じインデックスを出力するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 00:44:28575ブラウズ

Why do all my buttons print the same index when using a lambda in a loop?

ラムダのクロージャを理解する

ループ内でラムダを使用してコマンドをボタンにバインドしようとすると、一般的な問題が発生します。期待されるインデックスを出力する代わりに、ループ変数の最終値を一貫して出力します。これは、クロージャの変数解決メカニズムによって発生します。

提供された例では:

<code class="python">for i in range(5):
    make_button = Tkinter.Button(frame, text ="make!", 
                                 command= lambda: makeId(i))</code>

ラムダが実行されると、変数 i がその瞬間の値に解決されます。それまでにループが終了しているため、i は 5 に増加し、すべてのボタンが同じインデックスを出力します。

これを修正するには、構文 command= lambda i= を使用してラムダ内にローカル変数を作成できます。私:。これにより、i の現在の値が、ラムダ クロージャによってキャプチャされたローカル変数に割り当てられます。

<code class="python">make_button = Tkinter.Button(frame, text ="make!", 
                              command= lambda i=i: makeId(i))</code>

これで、ラムダは各ボタンの正しいインデックス値を使用して実行されます。ローカル変数には任意の名前を割り当てることができ、ループ変数とは区別できることに注意してください。

以上がループ内でラムダを使用すると、すべてのボタンが同じインデックスを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。