ホームページ > バックエンド開発 > Python チュートリアル > Python ループ内の Lambda 関数が適切にバインドできない場合があるのはなぜですか?

Python ループ内の Lambda 関数が適切にバインドできない場合があるのはなぜですか?

Barbara Streisand
リリース: 2024-12-26 19:43:22
オリジナル
461 人が閲覧しました

Why Do Lambda Functions in Python Loops Sometimes Fail to Bind Properly?

ループ内の Lambda 関数

Python では、ラムダ関数は匿名関数を定義する簡潔な方法を提供します。ただし、ループ内で使用すると、適切なバインディングが保証されていない場合、予期しない動作が発生する可能性があります。

次のコード スニペットを検討してください:

directorys = {'login': <object>, 'home': <object>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
ログイン後にコピー

目的は、辞書マッピング コマンドを作成することです。ディレクトリを変更する関数に文字列を追加します。ただし、結果は予想外です。作成された 2 つのラムダ関数は同一であり、同じコマンドを実行し、ディレクトリを "login" に変更します。

なぜこれが起こるのか?

ループ内の Lambda 関数は同じ関数スコープを共有します。これは、ラムダ関数によってキャプチャされた変数がループのすべての反復で同じであることを意味します。この場合、「d」は「directorys」辞書の最後の項目の値、つまり「login」を表します。

問題の解決

確実に行うには適切なバインドを行うには、各ラムダ関数が独自の一意の値「d」にアクセスできるようにする必要があります。 1 つのアプローチは、デフォルト値を持つパラメーターとして "d" を渡すことです。

lambda d=d: self.root.change_directory(d)
ログイン後にコピー

ループの各反復で "d" のデフォルト値を "d" の現在の値に設定することで、各ラムダ関数に一意のクロージャを作成します。あるいは、追加のクロージャ手法を使用して同じ結果を達成することもできます。

(lambda d=d: lambda: self.root.change_directory(d))()
ログイン後にコピー

この外側のラムダ関数は "d" のクロージャを作成し、内側のラムダ関数はクロージャからの "d" を使用します。

以上がPython ループ内の Lambda 関数が適切にバインドできない場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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