Python-循环中的Python Lambda

发布于 2021-02-02 23:23:35

考虑以下代码片段:

# 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 ?
}

我真的不明白为什么。你有什么建议吗 ?

关注者
0
被浏览
143
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你需要为创建的每个函数绑定d。一种方法是将其作为具有默认值的参数传递:

    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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看