python - python 中 lambda 的奇怪用法

标签 python lambda

我遇到的部分代码如下,其中 workers是类对象的列表:

worker_threads = []
for worker in workers:
    worker_fn = lambda worker=worker: worker.run(sess, coord, FLAGS.t_max)
    t = threading.Thread(target=worker_fn)
    t.start()
    worker_threads.append(t)

通常我期望 lambda 的语法是 lambda x : func(x) ,但这里的 worker=worker 是什么?用于?

最佳答案

正在绑定(bind) worker 的值在 lambda 内部。这是此技术的一个简化示例:

>>> thunks = [lambda: i for i in range(5)]
>>> [thunk() for thunk in thunks]
[4, 4, 4, 4, 4]
>>>
>>> thunks = [lambda i=i: i for i in range(5)]
>>> [thunk() for thunk in thunks]
[0, 1, 2, 3, 4]

使用表达式lambda: i , i在 lambda 被调用时计算,而不是在定义时计算。因此,在第一个示例中,所有 thunk 的结果都是 4因为这就是 i 的值有在 range(5) 的末尾循环。

使用表达式lambda i=i: i ,现在的值为 i立即在循环内求值,以提供 i 的默认值范围。这允许每个 thunk 捕获唯一值 i .

如果为参数指定不同的名称而不是隐藏 i,概念可能会更清晰:

>>> thunks = [lambda n=i: n for i in range(5)]
>>> [thunk() for thunk in thunks]
[0, 1, 2, 3, 4]

在您的示例中,lambda 可以写为:

worker_fn = lambda w=worker: w.run(sess, coord, FLAGS.t_max)

这与 worker=worker: worker.run... 的行为相同代码中的表达式,但可能会更清楚地表明表达式的目的是获取 worker 的当前值并将其作为参数传递到 lambda 主体中。

关于python - python 中 lambda 的奇怪用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66266032/

相关文章:

Scala 下划线用于简化函数字面量的语法

python - 如何将 Pandas 数据框转换为命名元组

python - 查询任务 ':app:compileDebugJavaWithJavac'属性 'options.generatedSourceOutputDirectory'的值失败

python - SQLAlchemy PyODBC MS SQL Server 无 DSN 连接

python - python 两个字符串列表之间的交集

c# - EF lambda : The Include path expression must refer to a navigation property

python - python 将骰子的两个结果相加

python - Rdd lambda 函数围绕行与列的混淆

c# - 查找两个字符串列表之间的差异

java - 使用一个 map-filter lambda 表达式从项目列表中检索对象字段