在一个循环,我想两个节点s到推迟比较的两个值()到以后的时间。
class Node():
def __init__(self, v):
self.v = v
def value(self):
return self.v
nodes = [Node(0), Node(1), Node(2), Node(3), Node(4), Node(2)]
results = []
for i in [0, 1, 2]:
j = i + 3
results.append(lambda: nodes[i].value() == nodes[j].value())
for result in results:
print result
结果都是真(因为I,J == 2,5所有的lambda表达式)。 我怎样才能推迟拉姆达的执行,直到它实际上是所谓的,但正确的变量绑定? 而在lambda表达式不一定都是平等的......还有很多其他的更复杂的表达式。
谢谢你的帮助!
为了当前值绑定i
和j
的功能,而不必让它看起来外的范围,你可以使用一个关闭或默认参数值。 要做到这一点最简单的方法是在你的拉姆达使用默认参数值:
for i in [0, 1, 2]:
j = i + 3
results.append(lambda i=i, j=j: nodes[i].value() == nodes[j].value())
下面是它是如何看起来像一个封闭:
def make_comp_func(i, j):
return lambda: nodes[i].value() == nodes[j].value()
for i in [0, 1, 2]:
j = i + 3
results.append(make_comp_func(i, j))
敷在另一个lambda:
results.append((lambda x, y: lambda: nodes[x].value() == nodes[y].value()) (i, j))
或在一个更好的方式,用partial
:
from functools import partial
results.append(partial(lambda x, y: nodes[x].value() == nodes[y].value(), i, j))
默认参数诀窍是,嗯......一招,我会建议,以避免它。
惯用的方法是使用默认参数:
[f() for f in [lambda: i for i in range(3)]]
[2, 2, 2]
此更改为:
[f() for f in [lambda i=i: i for i in range(3)]]
[0, 1, 2]