ホームページ >バックエンド開発 >Python チュートリアル >私のボタンのコマンドが Lambda のループで常に同じインデックスを出力するのはなぜですか?
ラムダのクロージャを理解する: 変数の解決
この状況では、ループ内に複数のボタンを作成しようとしています。特定のインデックス値を出力するコマンドをトリガーするボタン。ただし、ボタンのコマンドが常に同じインデックス "5" を出力するという問題が発生しています。
この動作は、ラムダのクロージャの性質に起因します。ラムダが定義されると、それを囲んでいるスコープの変数がキャプチャされ、実行時に参照されます。あなたの場合、囲むスコープはループであり、変数 i は現在のインデックスを表します。
残念ながら、ラムダが実行されるとき (ボタンが押されたとき)、i の値はすでに最後のインデックスに達しています。繰り返しであり、すべてのボタンで「5」に等しくなります。これは、キャプチャされた変数 i が同じメモリ位置への参照であり、それが保持する値がループの進行につれて更新されるためです。
この問題を解決するには、正しい値をキャプチャするクロージャを作成する必要があります。各ボタンの i 。これを行うには、ラムダ関数の i パラメーターにデフォルト値を指定します。例:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
ラムダ パラメーターのデフォルト値として i=i を指定すると、各ボタンの正しいインデックス値を保持するローカル変数 i が作成されます。ボタンが押されると、取得したローカル変数 i を使用してラムダ関数が実行され、正しいインデックスが出力されます。
以上が私のボタンのコマンドが Lambda のループで常に同じインデックスを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。