循环中的 Lambda 闭包和变量作用域
在循环中定义 lambda 时,了解变量作用域的工作原理非常重要。在提供的代码片段中,循环内创建的每个 lambda 引用相同的变量 obj,该变量在每次迭代时都会修改。
默认范围解析
默认情况下, lambda 将从封闭范围捕获变量。在给定的代码中,封闭范围是循环块。因此,每个 lambda 有效地捕获 obj 的最后一个值。从不同范围调用 lambda 时,此行为可能会导致错误结果,因为它们可能没有预期值。
捕获局部变量
要解决此问题,您需要强制 lambda 捕获 obj 的当前值。这可以通过在 lambda 中引入一个在创建时绑定到 obj 的新局部变量来实现。以下代码片段演示了这种方法:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda obj=obj: obj.some_var)
通过显式将 obj 作为参数传递给 lambda,我们为每个 lambda 创建一个新的局部变量。这确保每个 lambda 从循环迭代中捕获 obj 的本地值。因此,当您从另一个范围调用 lambda 时,它们将访问正确的值。
以上是如何捕获循环内 lambda 闭包中的局部变量?的详细内容。更多信息请关注PHP中文网其他相关文章!