ホームページ >バックエンド開発 >Python チュートリアル >ループ内で Lambda 関数を使用すると、すべてのボタンが同じインデックスを印刷するのはなぜですか?
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 サイトの他の関連記事を参照してください。