python:UnboundLocalError: local variable 'xxx' referenced before assignment

时间:2022-01-05 03:50:25

近来一直都在学习python语言,偶然在伯乐在线看到2017年京东C/C++的面试题。就打算用python+ST3 IDE顺便敲下面试题代码。

原题 C语言:

 1 #include <stdio.h>
 2 int cnt=0;
 3 int fib(int n){
 4   cnt++;
 5   if(n==0) 
 6     return 1; 
 7   else if(n==1) 
 8     return 2; 
 9   else 
10     return fib(n-1)+fib(n-2);
11 }
12 void main()
13 {
14   fib(8);
15   printf("%d",cnt);//问题:cnt等于多少?
16 }

原题 python语言:

 1 cnt = 0
 2 def fib(n):
 3     cnt+=1
 4     if n==0:
 5         return 1
 6     if n==1:
 7         return 2
 8     return fib(n-1)+fib(n-2)
 9 values = fib(8)
10 print cnt ,values

乍一眼看,我写的python代码没错吧。但是很囧的事情,既然我写的python代码报错了(python初学者,大家误喷)。

python:UnboundLocalError: local variable 'xxx' referenced before assignment

提示局部变量'cnt'在没有声明就引用了。后来想到python提供global关键字引用全局变量。就尝试了一番。

 1 cnt = 0
 2 def fib(n):
 3     global cnt
 4     cnt+=1
 5     if n==0:
 6         return 1
 7     if n==1:
 8         return 2
 9     return fib(n-1)+fib(n-2)
10 values = fib(8)
11 print cnt ,values

没报错,正常运行。后来多方收集资料,针对全局变量和局部变量的使用,总结如下:

1.内部函数,不修改全局变量可以直接访问全局变量。

 1 cnt = 0
 2 def fib(n):
 3     #global cnt
 4     #cnt+=1
 5     print cnt #直接访问全局变量,不修改,不报错
 6     if n==0:
 7         return 1
 8     if n==1:
 9         return 2
10     return fib(n-1)+fib(n-2)
11 values = fib(8)
12 print cnt ,values

2.内部函数,修改同名全局变量,则python会认为它是一个局部变量。如要让python认为是全局变量,使用global关键字。

 1 cnt = 0
 2 def fib(n):
 3     #global cnt
 4     cnt = n
 5     print 'fib inside:cnt = %d' % cnt
 6     if n==0:
 7         return 1
 8     if n==1:
 9         return 2
10     return fib(n-1)+fib(n-2)
11 fib(1)
12 print cnt
13 
14 fib inside:cnt = 1
15 0

3.在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError。

 1 cnt = 0
 2 def fib(n):
 3     #global cnt
 4     print cnt #这行报错
 5     cnt+=1
 6     if n==0:
 7         return 1
 8     if n==1:
 9         return 2
10     return fib(n-1)+fib(n-2)
11 values = fib(8)
12 print cnt ,values