ホームページ > バックエンド開発 > Python チュートリアル > ループ内でラムダを作成するときに変数のクロージャを回避するにはどうすればよいですか?

ループ内でラムダを作成するときに変数のクロージャを回避するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-16 14:31:03
オリジナル
653 人が閲覧しました

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

変数クロージャを使用しないループ内でのラムダの作成

オブジェクトのリストを反復するループ内でラムダを作成する場合、次のことが重要です。変数のクロージャーを防ぎます。変数のクロージャは、関数がその直接のスコープ外の変数へのアクセスを保持するときに発生します。これにより、すべてのラムダが変数の同じ最終値を参照するなど、予期しない動作が発生する可能性があります。

問題:

次のコードは、問題を示しています:

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート