首页 > 后端开发 > Python教程 > Python Lambda 函数闭包实际捕获哪些变量?

Python Lambda 函数闭包实际捕获哪些变量?

DDD
发布: 2024-12-29 06:55:14
原创
354 人浏览过

What Variables Do Python Lambda Function Closures Actually Capture?

Python Lambda 函数闭包捕获什么?

使用 Python lambda 函数闭包时,了解其捕获行为非常重要。闭包从其封闭范围捕获闭包中使用的变量值。然而,这种捕获发生的方式可能令人惊讶。

为了说明这一点,请考虑以下代码:

adders = [None, None, None, None]

for i in [0, 1, 2, 3]:
    adders[i] = lambda a: i + a

print(adders[1](3))
登录后复制

在此代码中,我们创建了一个 lambda 函数列表,这些函数采用单个输入并向其添加一个常量值。在函数创建期间,常量值最初设置为 i 的值。然而,当我们检查闭包列表时,我们惊讶地发现它们都引用了 i 的最终值,导致意外输出 6。

这种行为是由于闭包捕获了 i 的值而导致的。变量而不是它的引用。因此,当闭包创建后 i 的值发生变化时,闭包将继续引用最后捕获的值。

捕获当前值

捕获i 的当前值,我们可以使用一种称为“虚拟参数”技术的技巧。通过声明一个与我们想要捕获的变量同名的参数,并为其提供该变量的默认值,我们强制闭包捕获当前值。

for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a  # <-- Note the dummy parameter with a default value

print(adders[1](3))  # Output: 4
登录后复制

通过这种技术,闭包将捕获 i 在创建时的值,确保之后对 i 的更改不会影响闭包的行为。

以上是Python Lambda 函数闭包实际捕获哪些变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

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