考虑以下代码片段:
# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
self.command["cd " + d] = (lambda : self.root.change_directory(d))
我希望创建一个包含两个函数的字典,如下所示:
# Expected :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("home")
}
但看起来生成的两个 lambda 函数完全相同:
# Result :
self.command == {
"cd login": lambda: self.root.change_directory("login"),
"cd home": lambda: self.root.change_directory("login") # <- Why login ?
}
我真的不明白为什么。你有什么建议吗 ?
原文由 FunkySayu 发布,翻译遵循 CC BY-SA 4.0 许可协议
您需要为每个创建的函数绑定 d。一种方法是将其作为具有默认值的参数传递:
现在函数内的 d 使用参数,即使它具有相同的名称,并且在创建函数时评估其默认值。为了帮助您看到这一点:
记住默认值是如何工作的,例如对于像列表和字典这样的可变对象,因为您正在绑定一个对象。
这种具有默认值的参数习惯用法很常见,但如果您内省函数参数并根据它们的存在来确定要做什么,则可能会失败。您可以使用另一个闭包来避免该参数: