私のボタンのコマンドが Lambda のループで常に同じインデックスを出力するのはなぜですか?

Susan Sarandon
リリース: 2024-10-26 03:54:27
オリジナル
810 人が閲覧しました

 Why Does My Button's Command Always Print the Same Index in a Loop with a 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!