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)

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

回答

正在完成绑定workerlambda 内部的值。这是此技术的一个简化示例:

>>> 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: ii调用lambda时计算,而不是在定义时计算。因此,在第一个示例中,所有 thunk 的结果都是4因为这irange(5)循环结束时的值。

使用表达式lambda i=i: i,现在将i立即在循环内评估的值,以提供i参数的默认值。这允许每个 thunk 捕获 的唯一值i

如果参数被赋予不同的名称而不是 shadowing ,这个概念可能会更清楚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 的主体中。

  • It's probably important to point out that this behavior is not specific to lambda expressions, all functions work this way

以上是python中lambda的一个奇怪用法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>