近來一直都在學習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