python:UnboundLocalError: local variable 'xxx' referenced before assignment
近来一直都在学习python语言,偶然在伯乐在线看到2017年京东C/C++的面试题。就打算用python+ST3 IDE顺便敲下面试题代码。
原题 C语言:
#include <stdio.h>
int cnt=;
int fib(int n){
cnt++;
if(n==)
return ;
else if(n==)
return ;
else
return fib(n-)+fib(n-);
}
void main()
{
fib();
printf("%d",cnt);//问题:cnt等于多少?
}
原题 python语言:
cnt = 0
def fib(n):
cnt+=1
if n==0:
return 1
if n==1:
return 2
return fib(n-1)+fib(n-2)
values = fib(8)
print cnt ,values
乍一眼看,我写的python代码没错吧。但是很囧的事情,既然我写的python代码报错了(python初学者,大家误喷)。
提示局部变量'cnt'在没有声明就引用了。后来想到python提供global关键字引用全局变量。就尝试了一番。
cnt = 0
def fib(n):
global cnt
cnt+=1
if n==0:
return 1
if n==1:
return 2
return fib(n-1)+fib(n-2)
values = fib(8)
print cnt ,values
没报错,正常运行。后来多方收集资料,针对全局变量和局部变量的使用,总结如下:
1.内部函数,不修改全局变量可以直接访问全局变量。
cnt = 0
def fib(n):
#global cnt
#cnt+=1
print cnt #直接访问全局变量,不修改,不报错
if n==0:
return 1
if n==1:
return 2
return fib(n-1)+fib(n-2)
values = fib(8)
print cnt ,values
2.内部函数,修改同名全局变量,则python会认为它是一个局部变量。如要让python认为是全局变量,使用global关键字。
cnt = 0
def fib(n):
#global cnt
cnt = n
print 'fib inside:cnt = %d' % cnt
if n==0:
return 1
if n==1:
return 2
return fib(n-1)+fib(n-2)
fib(1)
print cnt fib inside:cnt = 1
0
3.在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError。
cnt = 0
def fib(n):
#global cnt
print cnt #这行报错
cnt+=1
if n==0:
return 1
if n==1:
return 2
return fib(n-1)+fib(n-2)
values = fib(8)
print cnt ,values
python:UnboundLocalError: local variable 'xxx' referenced before assignment的更多相关文章
- python: local variable 'xxx' referenced before assignment
问题发现 xxx = 23 def PrintFileName(strFileName): if xxx == 23: print strFileName xxx = 24 PrintFileName ...
- UnboundLocalError: local variable ‘xxx‘ referenced before assignment
原因 在Python函数中调用了某个和全局变量同名的局部变量,导致编译器不知道此时使用的是全局变量还是局部变量 a = 3 def func(): a+=3 func() UnboundLocalEr ...
- Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment
参考链接: http://blog.csdn.net/onlyanyz/article/details/45009697 https://www.cnblogs.com/fendou-999/p/38 ...
- 洗礼灵魂,修炼python(23)--自定义函数(4)—闭包进阶问题—>报错UnboundLocalError: local variable 'x' referenced before assignment
闭包(lexical closure) 什么是闭包前面已经说过了,但是由于遗留问题,所以单独作为一个章节详解讲解下 不多说,看例子: def funx(x): def funy(y): return ...
- [合集]解决Python报错:local variable 'xxx' referenced before assignment
a = 1 def use(): print(a) #输出1 引用不会报错 a = 1 def use(): a = 3 print(a) #输出 3 重新赋值也不会报错. 局部变量会优先在函数内部去 ...
- _markupbase.py if not match: UnboundLocalError: local variable 'match' referenced before assignment,分析Python 库 html.parser 中存在的一个解析BUG
BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去): **************\lib\site-packages\bs4\builder\_htmlparser.py:78: U ...
- 解决Python报错:local variable 'xxx' referenced before assignment(引)
解决Python报错:local variable 'xxx' referenced before assignment(引) 解决Python报错:local variable 'xxx' refe ...
- local variable 'xxx' referenced before assignment
这个问题很囧,在外面定义了一个变量 xxx ,然后在python的一个函数或类里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before as ...
- local variable 'xxx' referenced before assignment(犯过同样的错)
这个问题很囧,在外面定义了一个变量 xxx ,然后在Python的一个函数里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before assi ...
随机推荐
- Happy Number——LeetCode
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- Spring 3.x企业应用开发实战(9-1)----依赖注入
Spring中的依赖注入方式:属性注入.构造函数注入和工厂方式注入. 1.属性注入 属性注入即通过setXxx()方法注入Bean的属性值或依赖对象. 属性注入要求Bean提供一个默认的构造函数,在J ...
- SSH动态查询封装接口介绍
SSH动态查询封装接口介绍 1.查询记录总条数 public int count(Class c,Object[][] eq,Object[][] like,String[] group,String ...
- Analyzing UI Performance with Systrace 使用systrace工具分析ui性能
While developing your application, you should check that user interactions are buttery smooth, runni ...
- 【iOS控制器跳转时,NavigationBar有阴影动画闪过的解决办法】
如题,push控制器时,由于默认的控制器view是黑色,push到这个控制器时,navigationBar(默认是透明效果)后面有一个黑色阴影一闪而过,解决办法将navigationBar设为图片填充 ...
- shell脚本中echo显示内容带颜色
转自:http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要 ...
- 9.2noip模拟试题
题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out ...
- PHP 网页爬虫
只能爬一个页面 <?php function get_urls($url){ $url_array=array(); $the_first_content=file_get_contents($ ...
- HTML5 离线缓存
离线资源缓存 为了能够让用户在离线状态下继续访问 Web 应用,开发者需要提供一个 cache manifest 文件.这个文件中列出了所有需要在离线状态下使用的资源,浏览器会把这些资源缓存到本地. ...
- (转)Android调用系统自带的文件管理器进行文件选择并获得路径
Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器.Android API也提供了相应的接口. 基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI, ...