我知道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)
当然可以。
答案 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
的名称查找是在运行时完成的,这意味着该函数自身调用无数次(并且第一行没有任何用处)。如果你想要你期望的结果,那么你将不得不使用三元运算符立即返回而不是递归。