博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python:UnboundLocalError: local variable 'xxx' referenced before assignment
阅读量:5243 次
发布时间:2019-06-14

本文共 1753 字,大约阅读时间需要 5 分钟。

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

原题 C语言:

1 #include 
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初学者,大家误喷)。

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

 

转载于:https://www.cnblogs.com/nx520zj/p/5806561.html

你可能感兴趣的文章
慕课网之JavaScript-空格
查看>>
Kafka学习之(七)搭建kafka可视化服务Kafka Eagle
查看>>
专业术语/Java专有名词
查看>>
关于中年危机
查看>>
嵌套元组拆包及具名元组
查看>>
SQL中char、varchar、nvarchar的区别
查看>>
sap screen design
查看>>
Python 3.5(十二)文件操作
查看>>
Oracle常见错误:ORA-06550、ORA-00911、ORA-02085
查看>>
抛出异常,程序照样报错,如果是全部抛出,就不会报错了
查看>>
BZOJ 4816
查看>>
【ORA错误大全】 ORA-19527
查看>>
sql_id VS hash_value
查看>>
AX客户端连接变化
查看>>
Java语言中的修饰符
查看>>
xshell设置使用
查看>>
Java 获取 文件md5校验码
查看>>
[转]编译hadoop
查看>>
vue 有关框架
查看>>
类 Array Arraylist List Hashtable Dictionary
查看>>