在循环中创建 Lambda 时如何防止 Lambda 闭包混乱?

Barbara Streisand
发布: 2024-11-08 16:22:01
原创
1000 人浏览过

How Do You Prevent Lambda Closure Confusion When Creating Lambdas in Loops?

防止循环中的 Lambda 闭包混淆

在迭代对象列表的循环内创建 lambda 时,重要的是要注意lambda 闭包行为。默认情况下,lambda 在定义时捕获封闭范围内的变量。但是,如果变量在循环内发生更改,则稍后在循环中创建的 lambda 将引用更新的值。

考虑以下示例,其中我们创建 lambda 来访问对象的 some_var 属性:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda: obj.some_var)
登录后复制

如果我们随后迭代 lambda 列表并调用每个 lambda,我们可能会为所有 lambda 获得相同的值。这是因为循环中创建的最后一个 lambda 将捕获 obj 的最终状态,并且该值将由所有 lambda 返回。

为了解决这个问题,我们可以使用 lambda 指定要捕获的对象默认参数。这可确保每个 lambda 捕获正确的对象引用:

lambdas_list.append(lambda obj=obj: obj.some_var)
登录后复制

通过使用此方法,每个 lambda 将捕获它在创建时要引用的对象。这将防止混淆并确保 lambda 在循环中稍后调用时按预期运行。

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

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