Lambda 関数での変数のキャプチャ: クロージャ
Lambda 関数では、外側のスコープから変数をキャプチャすることが一般的な問題です。ラムダ関数は、デフォルトで、それを囲んでいるスコープ内の変数を参照します。ただし、これらの参照の解決は、定義中ではなく実行時に行われます。
このコード スニペットについて考えてみましょう。ループを使用して 5 つのボタンを作成し、各ボタンにコマンドをバインドして、 lambda function:
<code class="python">for i in range(5): make_button = Tkinter.Button(frame, text ="make!", command= lambda: makeId(i))</code>
このコードは、クリックされたボタンのインデックスを出力すると期待するかもしれません。ただし、i の値はループの終了時 (i が 5 にインクリメントされた後) にキャプチャされるため、常に "5" が出力されます。
解決策: クロージャを使用する
この問題を解決するには、クロージャを使用します。クロージャは、それを囲んでいるスコープから変数をキャプチャし、定義時にそれらを初期化する関数です。これにより、各ボタンの i の正しい値を取得できるようになります。
<code class="python">make_button = Tkinter.Button(frame, text ="make!", command= lambda i=i: makeId(i))</code>
ラムダ関数内で i=i を割り当てることで、ループからの i の現在の値で初期化されるローカル変数を作成します。 。これにより、各ボタンが目的のインデックスへの独自の参照を持つことが保証されます。
以上がLambda 関数が常に「5」を出力するのはなぜですか? Python で変数をキャプチャするためのガイド。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。