在循环内创建 Lambda 时如何避免变量闭包?

Mary-Kate Olsen
发布: 2024-11-16 14:31:03
原创
556 人浏览过

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

在没有变量闭包的循环内创建 Lambda 表达式

在迭代对象列表的循环内创建 Lambda 表达式时,重要的是防止变量闭包。当函数保留对其直接作用域之外的变量的访问时,就会发生变量闭包。这可能会导致意外行为,例如所有 lambda 引用变量的相同最终值。

问题:

以下代码演示了该问题:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda: obj.some_var)

for f in lambdas_list:
    print(f())
登录后复制

调用此代码中的 lambda 表达式时,所有 lambda 表达式都会产生相同的结果:obj_list 中最后一个对象的 obj.some_var 的值。这是因为 lambda 都引用同一个 obj 变量,该变量随着循环的每次迭代而变化。

解决方案:

为了防止变量闭包,我们可以使用语法 lambda x=x:其中 x 是我们要捕获的变量。这会捕获 obj 的副本并使其成为每个 lambda 的本地副本:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda obj=obj: obj.some_var)

for f in lambdas_list:
    print(f())
登录后复制

现在,每个 lambda 将引用正确的 obj 并生成 obj.some_var 的预期值。

以上是在循环内创建 Lambda 时如何避免变量闭包?的详细内容。更多信息请关注PHP中文网其他相关文章!

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