変数クロージャを使用しないループ内でのラムダの作成
オブジェクトのリストを反復するループ内でラムダを作成する場合、次のことが重要です。変数のクロージャーを防ぎます。変数のクロージャは、関数がその直接のスコープ外の変数へのアクセスを保持するときに発生します。これにより、すべてのラムダが変数の同じ最終値を参照するなど、予期しない動作が発生する可能性があります。
問題:
次のコードは、問題を示しています:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var) for f in lambdas_list: print(f())
このコードでラムダを呼び出すと、すべてのラムダは同じ結果、つまり値を生成します。 obj_list の最後のオブジェクトからの obj.some_var 。これは、ラムダがすべて同じ obj 変数を参照し、ループの反復ごとに変化するためです。
解決策:
変数のクロージャを防ぐには、次のようにします。構文 lambda x=x を使用します。ここで、x はキャプチャしたい変数です。これにより、obj のコピーがキャプチャされ、各ラムダに対してローカルになります:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda obj=obj: obj.some_var) for f in lambdas_list: print(f())
これで、各ラムダは正しい obj を参照し、obj.some_var の期待値を生成します。
以上がループ内でラムダを作成するときに変数のクロージャを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。