ラムダのクロージャを理解する
ループ内でラムダを使用してコマンドをボタンにバインドしようとすると、一般的な問題が発生します。期待されるインデックスを出力する代わりに、ループ変数の最終値を一貫して出力します。これは、クロージャの変数解決メカニズムによって発生します。
提供された例では:
<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 サイトの他の関連記事を参照してください。