ホームページ >バックエンド開発 >Python チュートリアル >ループ内の Lambda 関数がループ反復値ではなく最終インデックス値を取得するのはなぜですか?
Python Lambda 関数のクロージャを理解する
元の質問: インデックス印刷を使用した Lambda クロージャ パズル
プログラミングにおいて、クロージャとは、外側の関数が戻った後でも外側の関数の変数をキャプチャする内部関数を指します。これにより、内部関数が変数へのアクセスを保持できるようになり、クロージャの存続期間中変数が永続化されます。
ラムダ式の一般的な使用例は、変数を関数にバインドすることです。ただし、提供されているコード例のように、ラムダ関数をループ内で使用すると、クロージャが原因で予期しない動作が発生する可能性があります。
コードの説明
指定されたコードでは、ループ内に 5 つのボタンが作成されます。各ボタンには、makeId() 関数を呼び出してインデックス i を出力するラムダ関数が割り当てられています。ただし、ユーザーがいずれかのボタンをクリックすると、makeId() 関数は常にループ内の i の最終値である 5 を出力します。
問題と解決策
この問題は、ラムダ式が実行されると、変数 i がその時点の値に解決されるために発生します。その時点までにループはすでに終了しているため、i は最終値である 5 に解決されます。
この問題を解決するには、ラムダ式を変更して、ラムダ パラメーターを使用して i の正しい値を明示的に指定する必要があります。 。デフォルトでは、ラムダは囲んでいるスコープの変数を使用しますが、パラメータを指定すると、目的の値を持つローカル変数がラムダ内に確実に作成されます。
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
この変更により、各ボタンのラムダ関数は正しい値を取得します。ループから i を取得すると、makeId() 関数は目的のインデックスを正しく出力できます。
補足
ラムダ パラメーターは同じである必要はありません。 name を囲む変数として指定します。任意の名前を付けることができ、ラムダのスコープ内で正しい値が確実にキャプチャされます。
以上がループ内の Lambda 関数がループ反復値ではなく最終インデックス値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。