在没有变量闭包的循环内创建 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中文网其他相关文章!