在循环内创建 lambda [重复]
- 2024-12-31 08:38:00
- admin 原创
- 38
问题描述:
我正在尝试在遍历对象列表的循环内创建 lambda:
lambdas_list = []
for obj in obj_list:
lambdas_list.append(lambda : obj.some_var)
现在,如果我遍历 lambda 列表并像这样调用它们:
for f in lambdas_list:
print(f())
obj
我得到了相同的值。这是最后一个的值obj_list
,因为这是列表迭代器块中的最后一个变量。有什么好的(pythonic)重写代码以使其工作的想法吗?
解决方案 1:
改用这一行:
lambdas_list.append(lambda obj=obj: obj.some_var)
解决方案 2:
您要么必须使用默认分配来捕获变量
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
)引用的。
默认赋值之所以有效,是因为我们是i
从lambda
作用域引用的。我们使用默认赋值使“传递”变量成为隐式操作,方法是将其作为lambda
定义的一部分,从而成为其作用域的一部分。
闭包解决方案之所以有效,是因为变量“传递”是显式的,传递到lambda
立即执行的外部,从而在列表理解期间创建绑定并返回lambda
引用该绑定的内部。因此,当内部lambda
实际执行时,它将引用在外部作用域中创建的绑定lambda
。
解决方案 3:
你可以做类似的事情:
def build_lambda(obj):
return lambda : obj.some_var
lambdas_list = []
for obj in obj_list:
lambdas_list.append(build_lambda(obj))
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD