如果expression计算为一个参数的函数,我会认为 lambda x: ( expression )(x) 与expression相同- 但实际上并非如此。考虑 Y 组合子的以下两个定义:
def Y1(F):
left = lambda x: x(x)
right = lambda x: F(x(x))
return left(right)
def Y2(F):
left = lambda x: x(x)
right = lambda x: lambda y: (F(x(x)))(y)
return left(right)
Y2 实际上按预期工作,但调用 Y1 会引发堆栈溢出。为什么会有这种行为差异?