防止循环中的 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中文网其他相关文章!