Python 使用dict.get()的斐波那契级数和递归错误

Python 使用dict.get()的斐波那契级数和递归错误,python,python-3.x,dictionary,recursion,Python,Python 3.x,Dictionary,Recursion,我使用下面的代码来计算斐波那契级数的一个元素。 代码按原样正常工作 def fib(n, lookup=dict()): if n == 0 or n == 1: lookup[n] = n # This works if n not in lookup: # However, this doesn't # if not lookup.get(n): lookup[n] = fib(n - 1, lookup) + f

我使用下面的代码来计算斐波那契级数的一个元素。 代码按原样正常工作

def fib(n, lookup=dict()):
    if n == 0 or n == 1:
        lookup[n] = n

    # This works
    if n not in lookup:

    # However, this doesn't
    # if not lookup.get(n):

        lookup[n] = fib(n - 1, lookup) + fib(n - 2, lookup)

    return lookup[n]

print(fib(6))
现在,如果我使用

如果不查找。获取(n):

而不是:

如果n不在查找中:

我得到一个递归错误,即使我只计算第6个元素!:

RecursionError: maximum recursion depth exceeded in comparison
为什么会出现此错误

lookup.get(0) -> 0
0 in lookup -> True

0是一个“falsey”值,当您得到一个falsey值时,您会递归,因此带有
get
的版本会导致您在达到0时无限递归(由于您没有对其进行检查,因此递归为无限负值)。

解决方案是使用
if lookup.get(n)不是None
,因为这是默认情况下错过的get返回的结果。如果n不在查找中,IMO将使用更具python风格的解决方案。为什么混淆?:)如果lookup.get(n)在本例中为None,则为
。谢谢。@SamStafford我同意,我只是想知道为什么我用它得到了不同的结果。得到这种错误基本上是因为Python风格的指导原则不鼓励依赖非bool类型的“真实性”。也就是说,不要使用其他东西作为
的代理,也不要使用truthy检查作为
不是无的代理(