我遇到的部分代码如下,其中 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/