近来一直都在学习python语言,偶然在伯乐在线看到2017年京东C/C++的面试题。就打算用python+ST3 IDE顺便敲下面试题代码。
原题 C语言:
1 #include2 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初学者,大家误喷)。
提示局部变量'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 210 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 210 return fib(n-1)+fib(n-2)11 fib(1)12 print cnt13 14 fib inside:cnt = 115 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 210 return fib(n-1)+fib(n-2)11 values = fib(8)12 print cnt ,values