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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-15 10:21:09399ブラウズ

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

ループ内の Lambda 関数の動作

指定されたコード スニペットでは、辞書にラムダ関数が設定されています。各関数は、現在のディレクトリを特定の名前に変更する役割を果たします。ただし、ループが完了すると、すべてのラムダ関数は同じディレクトリ名を参照します。

これが発生する理由を理解するには、ループ内のラムダ関数の性質を認識することが重要です。 Lambda 関数はクロージャであり、それを囲んでいるスコープの値をキャプチャすることを意味します。この場合、ラムダ関数はループ内で定義され、d 変数の値を取得します。

ただし、d 変数はループ全体で再利用され、その値は継続的に上書きされます。その結果、すべてのラムダ関数は d の同じ最終値を取得することになります。

解決策

この問題を解決するには、各ラムダ関数を次のようにバインドする必要があります。 dの特定の値。これは、デフォルトのパラメーター値を使用することで実現できます。

lambda d=d: self.root.change_directory(d)

このコードでは、ラムダ関数は、ループ内の d の現在の値をデフォルト値とするオプションのパラメーター d を受け取ります。デフォルトのパラメーター値は関数の作成時に評価されるため、各ラムダ関数は独自の一意の d 値を取得します。

または、追加のクロージャを使用して同じ結果を得ることができます:

(lambda d: lambda: self.root.change_directory(d))(d)

この場合、外部ラムダ関数を使用して、変数 d の周囲にクロージャを作成します。次に、内部のラムダ関数を使用してディレクトリの変更が実行されます。

これらの手法を利用することで、ループ内の各ラムダ関数が d 変数に独自の一意のバインディングを持つことを保証でき、結果として目的の結果が得られます。行動。

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

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