【发布时间】:2020-11-03 03:22:11
【问题描述】:
我正在尝试使用列表推导创建延迟执行的 lambda 列表。 下面是一个简单的例子。
def func_a(message: str) -> None:
print('a: ' + message)
def func_b(message: str) -> None:
print('b: ' + message)
msg = 'some message'
funcs = [func_a, func_b]
funcs_w_args = [lambda : func(msg) for func in funcs]
for func in funcs_w_args:
func()
结果是
b: some message
b: some message
而期望的结果应该是
a: some message
b: some message
我哪里错了?
【问题讨论】:
-
(希望可以作为评论)我认为您遇到了名称冲突问题 - lambda 表示“查找函数 'func' 并运行它”。在列表理解之后,名称“func”-> func_b。基本上, func 在您实际运行 lambda 之前不会关闭,因此它没有提供您所期望的。我无法证明这一点(我认为 func 在理解后会有一个值,但它没有)但我敢打赌它是沿着这些思路。
-
(实际上,这正是@Carcigenicate 的链接问题所显示的内容,所以去那里寻找更好的例子:)
-
@Carcigenicate。感谢您的链接。它提供了对该主题的彻底讨论。如需快速直接的答案,我建议使用 CypherX。
标签: python lambda list-comprehension deferred-execution