首页 > 后端开发 > Python教程 > 为什么循环中的 Lambda 函数捕获最后一个值而不是每次迭代的值?

为什么循环中的 Lambda 函数捕获最后一个值而不是每次迭代的值?

Susan Sarandon
发布: 2024-12-21 07:52:10
原创
374 人浏览过

Why Do Lambda Functions in Loops Capture the Last Value Instead of Each Iteration's Value?

循环中的 Lambda

考虑以下代码片段:

# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
登录后复制

目标是创建一个包含两个带有键“的函数的字典” cd 登录”和“cd home”。然而,结果显示,两个 lambda 函数具有相同的内容,并且键为“cd login”。

要理解这种意外行为,重要的是要考虑 lambda 函数如何在嵌套循环中工作。当 lambda 函数在循环中定义时,它会捕获周围范围的变量。在这种情况下,循环中的变量 d 被每个 lambda 函数捕获。

但是,lambda 函数是延迟执行的。因此,当您在循环之外访问 self.command 字典时,所有 lambda 函数都捕获了相同的 d 变量,它是循环中 d 的最后一个值。因此,所有函数都指向相同的方法,从而导致观察到的行为。

为了解决这个问题,我们需要确保每个 lambda 函数捕获不同的 d 值。一种解决方案是将 d 作为参数传递给 lambda 函数并提供默认值:

lambda d=d: self.root.change_directory(d)
登录后复制

现在,lambda 函数内的 d 使用该参数,即使它具有相同的名称。创建函数时会计算此参数的默认值,并为循环的每次迭代将其绑定到正确的 d 值。

或者,我们可以使用嵌套闭包来实现相同的结果:

(lambda d: lambda: self.root.change_directory(d))(d)
登录后复制

以上是为什么循环中的 Lambda 函数捕获最后一个值而不是每次迭代的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板