为什么在Python 3.5中分配lambda不能按预期工作?

时间:2016-01-29 10:57:45

标签: python-3.x lambda

我知道Python应该具有一流的功能,并且我已经编写了一些Python,并且确认了#34;那,但是以下爆炸(用完堆栈深度)我的IDLE在3.5:

k = lambda x:x+1
k = lambda x:k (x+1)
k(0)

不应该评估为2?

k = lambda x:x+1
j = lambda x:k (x+1)
j(0)
当然可以。

2 个答案:

答案 0 :(得分:2)

使用lambda

进行可视化

稍微打印可能有助于了解正在发生的事情:

k = lambda x: x+1
print('before:', id(k))
k = lambda x: print('in    :', id(k))
k(0)
print('after :', id(k))

before: 4428659024
in    : 4428658208
after : 4428658208

最后id的{​​{1}}与其中使用的lambda相同。这很好地证明了后期绑定。

转换为函数语句

如果您将lambda转换为使用def的函数定义,事情可能会更清楚:

def k(x):
    return x + 1

def k(x):
    return k(x+1)
k(0)

很明显,第一个定义确实有意义,因为它被第二个定义覆盖。

此外,即使您为函数使用不同的名称并重新分配函数名称:

def k(x):
    return x + 1

def j(x):
    return k(x+1)

k = j

似乎更清楚的是,第一个函数定义没有意义,因为永远无法达到该函数。

答案 1 :(得分:1)

k的名称查找是在运行时完成的,这意味着该函数自身调用无数次(并且第一行没有任何用处)。如果你想要你期望的结果,那么你将不得不使用三元运算符立即返回而不是递归。