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