Python中使用lambda的延迟求值

Python中使用lambda的延迟求值,python,lambda,deferred-execution,Python,Lambda,Deferred Execution,在循环中,我试图将两个节点的两个value()的比较推迟到以后进行 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

在循环中,我试图将两个节点的两个value()的比较推迟到以后进行

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
结果都是正确的(因为对于所有lambda,i,j==2,5)。如何延迟lambda的执行,直到它实际被调用,但使用正确的变量绑定?lambda中的表达式不一定都相等。。。还有很多其他更复杂的表达方式


谢谢你的帮助

要将
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))

惯用的方法是使用默认参数:

[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]

用另一个lambda包装:

results.append((lambda x, y: lambda: nodes[x].value() == nodes[y].value()) (i, j))
或者以更好的方式,使用
部分

from functools import partial

results.append(partial(lambda x, y: nodes[x].value() == nodes[y].value(), i, j))

默认参数技巧是,嗯。。。这是一个诡计,我建议你避免它。

我真的不知道你想做什么。在这里,lambda表达式对我来说似乎没有必要。为什么不能直接执行
results.append(节点[i].value()==节点[j].value())