在循环中,我试图将两个节点的两个value()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
结果都是真的(因为我,j == 2,5对于所有的lambda)。我怎样才能推迟执行lambda直到实际调用它,但是使用正确的变量绑定?并且lambda中的表达式并不一定都是相等的...还有一堆其他更复杂的表达式。
感谢您的帮助!
答案 0 :(得分:13)
要将i
和j
的当前值绑定到函数而不是让它在外部作用域中查找,可以使用闭包或默认参数值。最简单的方法是在lambda中使用默认参数值:
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))
答案 1 :(得分:6)
将它包裹在另一个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))
默认参数技巧是,嗯......一招,我建议避免它。
答案 2 :(得分:3)
惯用法是使用默认参数:
[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]