ループ内でのラムダ クロージャの混乱の防止
オブジェクトのリストを反復するループ内でラムダを作成する場合、次の点に注意することが重要です。ラムダクロージャーの動作。デフォルトでは、ラムダは変数が定義されるときに、それを囲んでいるスコープ内の変数をキャプチャします。ただし、ループ内で変数が変更された場合、ループ内で後から作成されたラムダは更新された値を参照します。
オブジェクトの some_var 属性にアクセスするラムダを作成する次の例を考えてみましょう。
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var)
その後、ラムダ リストを反復処理して各ラムダを呼び出すと、すべてのラムダで同じ値が得られる可能性があります。これは、ループ内で作成された最後のラムダが obj の最終状態をキャプチャし、その値がすべてのラムダによって返されるためです。
これを解決するには、次を使用してラムダによってキャプチャされるオブジェクトを指定できます。デフォルトの引数。これにより、各ラムダが正しいオブジェクト参照を確実にキャプチャします。
lambdas_list.append(lambda obj=obj: obj.some_var)
このアプローチを使用すると、各ラムダは、作成時に参照する予定だったオブジェクトをキャプチャします。これにより混乱が防止され、ループの後半で呼び出されたときにラムダが期待どおりに動作することが保証されます。
以上がループ内でラムダを作成するときにラムダ クロージャの混乱を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。