为什么递归lambda函数中的列表选择会引发递归限制错误?

时间:2017-11-02 18:45:05

标签: python python-2.7 recursion lambda

考虑以下两个递归函数来计算输入的阶乘,我天真地认为它们是相同的:

  1. fact = lambda x: 1 if x == 0 else x * fact(x-1)

  2. fact = lambda x: [x*fact(x-1),1][x==0]

  3. 第一个运行正常,但第二个运行错误RuntimeError: maximum recursion depth exceeded。这适用于x==0x!=0

    的输入

    为什么lambda函数不能处理第二种情况?

1 个答案:

答案 0 :(得分:2)

他们不一样。在第二个变量中,将评估列表中的两个表达式,然后才从中选择适当的表达式。但即使x == 0,这也不能阻止递归的发生。因此,递归继续进入负数,进入内存限制。

另一方面,

... if ... else ...将首先评估if关键字后的条件,评估与该结果对应的表达式。