ホームページ >バックエンド開発 >Python チュートリアル >私のボタンのコマンドが Lambda のループで常に同じインデックスを出力するのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 03:54:27903ブラウズ

 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 サイトの他の関連記事を参照してください。

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