在循环内创建 lambda [重复]

Posted

技术标签:

【中文标题】在循环内创建 lambda [重复]【英文标题】:Creating lambda inside a loop [duplicate] 【发布时间】:2011-11-24 16:01:01 【问题描述】:

可能重复:What do (lambda) function closures capture in Python?lambda function don't closure the parameter in Python?

我正在尝试在循环中创建 lambda,该循环遍历对象列表:

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

现在,如果我遍历 lambda 列表并像这样调用它们:

for f in lambdas_list:
    print f()

我得到相同的值。这是obj_list 中最后一个obj 的值,因为它是列表迭代器块中的最后一个变量。对代码进行良好(pythonic)重写以使其工作的任何想法?

【问题讨论】:

见***.com/questions/2295290/…和***.com/questions/7514093/…。 最具描述性的答案:***.com/questions/938429/… 【参考方案1】:

您要么必须使用默认分配捕获变量

lambdas_list = [ lambda i=o: i.some_var for o in obj_list ]

或者,使用闭包来捕获变量

lambdas_list = [ (lambda a: lambda: a.some_var)(o) for o in obj_list ]

在这两种情况下,关键是确保 obj_list 列表中的每个值都分配给唯一的范围。

您的解决方案不起作用,因为词法变量 obj 是从父作用域(for)引用的。

默认分配有效,因为我们从lambda 范围引用i。我们使用默认赋值来隐式地“传递”变量,方法是使其成为lambda 定义的一部分,从而使其成为其范围。

闭包解决方案有效,因为变量“传递”是显式的,进入立即执行的外部lambda,因此在列表理解期间创建绑定并返回引用该绑定的内部lambda。因此,当内部 lambda 实际执行时,它将引用在外部 lambda 范围内创建的绑定。

【讨论】:

【参考方案2】:

你可以这样做:

def build_lambda(obj):
  return lambda : obj.some_var

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

【讨论】:

【参考方案3】:

改用这一行:

lambdas_list.append(lambda obj=obj: obj.some_var)

【讨论】:

以上是关于在循环内创建 lambda [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python lambda不记得for循环中的参数[重复]

for循环中的lambda只取最后一个值[重复]

如何在Python中的for循环内创建对象列表而不继承属性值[重复]

Python:将 lambda 函数附加到列表 [重复]

for循环中的lambda只取最后一个值[重复]

for循环中的lambda只取最后一个值[重复]