关于python:“赋值前引用的局部变量”

“local variable referenced before assignment”

本问题已经有最佳答案,请猛点这里访问。

我来自一个沉重的爪哇和PHP经验的国家,所以说到Python,很多规则对我来说都没有意义。

下面有一个递归的fibonacci函数,它指出了错误:

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

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
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中,这显然是有效的,因为调用是关于函数EDCOX1(0)的全局变量,因此它使我感到困惑,即调用在某种程度上不在范围之内。

我做错什么了?


在python中,您需要声明全局变量是全局的函数内部变量,函数将它们重新分配给不同的值。您可以使用global进行以下操作:

1
2
3
def fibcount(n):
    global calls
    ...

否则,python将把calls变量视为本地变量。

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

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

在python中,唯一允许使用全局变量的时间是希望使用模块级常量。在这种情况下,惯例是他们应该有所有的大写字母名称:

1
MYCONST = 12345