ホームページ >バックエンド開発 >Python チュートリアル >ループ内の Lambda 関数がすべて同じ変数を参照するのはなぜですか?

ループ内の Lambda 関数がすべて同じ変数を参照するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-29 03:45:10966ブラウズ

Why Do My Lambda Functions in a Loop All Refer to the Same Variable?

ループ内のラムダ

提供されたコードの目的は、各値がラムダ式であるコマンド関数の辞書を作成することです。これは、特定のディレクトリ名を使用して self.root.change_directory を呼び出します。ただし、このコードでは、すべてのコマンド関数が同じディレクトリ変更を実行するという誤った結果が生じます。

この問題は、ラムダ式が単一の変数 d を参照しているために発生します。この変数は、ループの各反復で同じです。その結果、すべてのラムダ式は d の最後の値を指すことになります。

これを修正するには、d の一意の値を各ラムダ式にバインドする必要があります。これは、以下に示すように、ラムダのパラメータのデフォルト値を使用することで実現できます。

self.command["cd " + d] = lambda d=d: self.root.change_directory(d)

この場合、d=d は、次の反復ごとに、d の現在の値への d の新しいバインディングを作成します。ループ。結果として、各ラムダ式は d 値への独自の一意の参照を持ちます。

代わりに、クロージャを使用して同じ効果を達成することもできます。

self.command["cd " + d] = (lambda d: lambda: self.root.change_directory(d))(d)

このクロージャは、新しいクロージャを作成します。各ラムダ式の環境。d は d の現在の値にバインドされます。したがって、各ラムダ式は、独自の一意の値 d にアクセスできます。

以上がループ内の Lambda 関数がすべて同じ変数を参照するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。