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