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

近來一直都在學習python語言,偶然在伯樂在線看到2017年京東C/C++的面試題。就打算用python+ST3 IDE順便敲下面試題代碼。python

原題 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語言:ide

 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初學者,你們誤噴)。函數

提示局部變量'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

沒報錯,正常運行。後來多方收集資料,針對全局變量和局部變量的使用,總結以下:spa

1.內部函數,不修改全局變量能夠直接訪問全局變量。3d

 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關鍵字。code

 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。blog

 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
相關文章
相關標籤/搜索