[解決済み] ループの中のラムダ [重複] [重複
2023-05-22 10:13:16
質問
以下のコードスニペットを考慮する。
# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
self.command["cd " + d] = (lambda : self.root.change_directory(d))
私は、以下のような2つの関数の辞書を作成することを期待しています。
# Expected :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("home")
}
のように見えますが、生成された2つのラムダ関数が全く同じものであるように見えます。
# Result :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("login") # <- Why login ?
}
私は本当に理由を理解していない。あなたは何か提案を持っていますか?
どのように解決するのですか?
作成した関数ごとにdをバインドする必要があります。そのための1つの方法は、デフォルト値でパラメータとして渡すことです。
lambda d=d: self.root.change_directory(d)
これで、関数内部のdは、同じ名前であってもパラメータを使用し、そのデフォルト値が関数作成時に評価されるようになりました。これを見やすくするために
lambda bound_d=d: self.root.change_directory(bound_d)
オブジェクトをバインドしているので、リストやディクスのようなミュータブルなオブジェクトの場合など、デフォルト値がどのように機能するかを覚えておいてください。
デフォルト値を持つパラメータのこのイディオムは十分に一般的ですが、関数パラメータをイントロスペクトし、その存在に基づいて何をすべきかを決定する場合、失敗する可能性があります。 別のクロージャでパラメータを回避することができます。
(lambda d=d: lambda: self.root.change_directory(d))()
# or
(lambda d: lambda: self.root.change_directory(d))(d)
関連
-
[解決済み] jQueryの各ループから抜け出すには?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] C#のループ - breakとcontinue
-
[解決済み] dict.copy()を理解する - 浅いか深いか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ラムダ関数のクロージャは何を捕捉するのか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Django filter queryset __in for *every* item in list