ホームページ >バックエンド開発 >Python チュートリアル >ループ内で Lambda 関数を使用すると、すべてのボタンが同じインデックスを印刷するのはなぜですか?

ループ内で Lambda 関数を使用すると、すべてのボタンが同じインデックスを印刷するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 18:26:29985ブラウズ

Why Do All Buttons Print the Same Index When Using Lambda Functions in a Loop?

Python のラムダ クロージャ

Python では、ラムダ関数はクロージャを作成し、スコープ外の変数へのアクセスを許可します。ただし、この動作をループ内で使用すると、予期しない結果が生じる可能性があります。

問題ステートメント

次のコードについて考えてみましょう。ここでは、ループを使用して 5 つのボタンが作成されています。各ボタンは、そのインデックスを出力するコマンドをバインドします。

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

動作

クリックすると、すべてのボタンが同じインデックス (常に 5) を出力します。これは次の理由で発生します。ラムダの変数解決は実行時に行われます。ボタンがクリックされるまでにループは終了し、すべてのボタンの i は 5 に等しくなります。

解決策

この問題を解決するには、次のことを行う必要があります。 i の正しい値を取得するローカル変数を各ラムダ内に作成します。これは、次のように i を引数としてラムダに渡すことで実現できます。

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

これにより、ラムダごとにローカルな i 変数が作成され、ループ反復からの i の値が保持されます。こうすることで、各ボタンが期待どおりのインデックスを印刷するようになります。

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

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