"在赋值之前引用的局部变量"

时间:2014-12-05 17:34:20

标签: python function recursion global-variables

我来自Java和PHP经验丰富的领域,所以当谈到Python时,许多规则对我来说都没有意义。

我在下面有一个递归的Fibonacci函数,它会发出错误:

Traceback (most recent call last):
  File "C:\Users\Nic\workspace\lab8\src\Main.py", line 26, in <module>
    print fibcount(27),"took",calls,"calls."
  File "C:\Users\Nic\workspace\lab8\src\Main.py", line 19, in fibcount
    calls += 1
UnboundLocalError: local variable 'calls' referenced before assignment

这是我的代码:

calls = 0

def fibcount(n):
    calls += 1
    if n < 2:
        return (1,1)
    f1,c1 = fibcount(n-1)
    f2,c2 = fibcount(n-2)
    return (f1+f2,c1+c2+1)

print fibcount(27),"took",calls,"calls."

在Java中,这显然是有效的,因为调用是函数fibcount()的全局变量,所以让我感到困惑的是,调用在某种程度上不在范围内。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

在Python中,您需要将全局变量声明为函数内部的全局变量,并将它们重新分配给不同的值。您可以使用global

def fibcount(n):
    global calls
    ...

否则,Python会将calls变量视为本地变量。

但请注意,您只需要为重新分配的全局变量执行此操作。只需阅读他们的价值观就可以了。

此外,重新分配这样的全局变量在Python中被认为是丑陋的,应该尽可能避免。大多数情况下,您应该坚持将值传递给函数,然后将变量重新分配给它们的返回值。如果您需要维护状态,请使用类。

在Python中唯一需要全局变量的是你想拥有模块级常量的时候。在这种情况下,惯例是它们应该具有全部名称:

MYCONST = 12345