UnboundLocalError: local variable ‘a‘ referenced before assignment(Python报错解决)
问题提出
使用Python编程的时候,要注意函数内可以访问全局变量,但不能更新(修改)其值。
比如:
a = 10
def sum ( n ) :n += aprint ('a = ', a, end = ' , ' )print ( 'n = ', n )sum(3)
输出:
a = 10 , n = 13
如果引用了还没更新的值则会报错 。比如函数内部调用了全局变量,但之后又修改了该变量,则会引发 UnboundLocalError错误。
a = 10
def sum ( n ) :n += a # 调用了全局变量a,但是之后又修改了a,引发错误a = 11 # 修改了全局变量print ('a = ', a, end = ' , ' )print ( 'n = ', n )sum(3)
输出:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-71-0359ebe4354d> in <module>()6 print ( 'n = ', n )7
----> 8 sum(3)<ipython-input-71-0359ebe4354d> in sum(n)1 a = 102 def sum ( n ) :
----> 3 n += a4 a = 115 print ('a = ', a, end = ' , ' )UnboundLocalError: local variable 'a' referenced before assignment
解决办法
办法1:先更新再引用
a = 10
def sum ( n ) :a = 11n += aprint ('a = ', a, end = ' , ' )print ( 'n = ', n )sum(3)
print ( '外 a = ', a )
输出:
a = 11 , n = 14
外 a = 10
办法2:函数内加上 global 引用以更新变量值
a = 10
def sum ( n ) :global an += aa = 11print ('a = ', a, end = ' , ' )print ( 'n = ', n )sum ( 3 )
print ( '外 a = ', a )
输出:
a = 11 , n = 13
外 a = 11
为什么加上 global就可以了呢?首先认识一下global。
认识global
global关键字可以定义一个变量,被定义的变量可以在变量作用域之外被修改,通俗讲就是一个全局的变量,这个全局的变量在其被定义后,可以在全部上文中修改和使用。当然,global的使用也有一些自己的规则,当我们在函数内部创建一个变量的时候,如果我们想让他变成一个全局变量,我们需要使用关键字global定义它,但是如果我们是在函数外面定义的变量,那么默认就是global的变量,不用再使用global关键字定义。
举个例子。
x = 100 #全局变量def func_x():x = x + 1print(x)func_x()
输出:
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-68-d07410756037> in <module>()5 print(x)6
----> 7 func_x()<ipython-input-68-d07410756037> in func_x()2 3 def func_x():
----> 4 x = x + 15 print(x)6 UnboundLocalError: local variable 'x' referenced before assignment
分析
在这个例子中设置的 x=100 属于全局变量,而在函数内部中没有对 x 的定义。
根据 Python 访问局部变量和全局变量的规则:当搜索一个变量的时候,Python 先从局部作用域开始搜索,如果在局部作用域没有找到该变量,那么 Python 就会在更外一层作用域范围寻找。最终在全局变量中找这个变量,如果找不到则抛出 UnboundLocalError 异常。
但本案例明明已经在全局变量中找到同名变量了,怎么还是报错?
因为,如果内部函数引用了外部函数的同名变量或者全局变量,并且对这个变量有修改的话,那么此时 Python 会认为它是一个局部变量,而函数中并没有 x 的定义和赋值,所以报错。
global 关键字就是专门用来解决此问题,在函数 func_x中,global x会告诉解释器 x 为全局变量,然后会在函数外面寻找 x 的定义,执行完 x = x + 1 后,x 依然是全局变量。
x = 100 #全局变量def func_x():global xx = x + 1print(x)func_x()
print('外 x = ', x )
输出:
101
外 x = 101
另外需要注意的是,global 关键字会跳过中间层直接将嵌套作用域内的局部变量变为全局变量。
测试如下:
num = 20def outer():num = 10def inner():global numprint("第1个num:",num)num = 100print("第2个num:",num)inner()print("第3个num:",num)outer()print('外 num = ', num )
输出:
第1个num: 20
第2个num: 100
第3个num: 10
外 num = 100
UnboundLocalError: local variable ‘a‘ referenced before assignment(Python报错解决)相关推荐
- python UnboundLocalError: local variable 'log_f' referenced before assignment 错误
在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...
- python 错误--UnboundLocalError: local variable 'num' referenced before assignment
val = 9 def test(flag): if flag: val = 1 else: print("test") return val if __name__ == '__ ...
- 【debug】UnboundLocalError local variable a referenced before assignment
1)下面这种情况是不会报错的: >>> x = 10 >>> def bar(): ... print(x) >>> bar() 10 (2)但是 ...
- UnboundLocalError: local variable ‘loss’ referenced before assignment解决方法
UnboundLocalError: local variable 'loss' referenced before assignment 文章目录 UnboundLocalError: local ...
- UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法
一.举例: 计算a到10的和 sum=0 def func(a):while a<=10:sum+=aa+=1return sum print(func(9)) 运行结果: UnboundLoc ...
- UnboundLocalError: local variable 'end_page' referenced before assignment
UnboundLocalError: local variable 'end_page' referenced before assignment 错误信息是在指出一个在使用之前没有赋值的局部变量.在 ...
- 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment
总结: 内部函数,不修改全局变量可以访问全局变量 内部函数,修改同名全局变量,则python会认为它是一个局部变量 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbou ...
- Python 读写当前路径下文件错误 UnboundLocalError: local variable 'file' referenced before assignment
python读取文件是个比较常用的操作,最近我在读取文件的时候却遇到下面这个问题. 我的代码是: try:file = open("./logs/test")... finally ...
- UnboundLocalError: local variable ‘Num_fSu‘ referenced before assignment
在计算中调用 函数 calculate_psd 的时候,报了如下错误 def calculate_psd(Num_Tai, np_Tai, nr_in_10, Num_sub, dt, Tai) -& ...
最新文章
- R数据导入导出(一): read.table()和read.csv()的区别
- php+数学计算公式,PHP数学计算函数总结
- 如何从服务器导出文件,如何从云服务器导出文件
- DISCUZ开启设计插件功能和显示嵌入点功能
- jsp调用controller方法_SpringMVC五大核心组件及调用过程
- What is the usage of Transfer field in Text determine procedure customizing
- 什么是js的严格模式
- 资源放送丨《 MySQL中的索引探究 - 2020云和恩墨大讲堂》PPT视频
- WF4.0实战(九):猜数字游戏,测下你的智力
- java多线程基础_java线程基础
- sql数据库身份验证登录
- 如何编写makefile文件
- 虚拟机安装Linux,设置固态ip,静态ip地址,docker安装
- Java入门级项目 汽车租赁系统
- cmake:cmake_policy命令
- SublimeText 3.2.3207 汉化破解免安装版(3264位)
- Apache shiro 官方API (中文版)(承蒙大佬们看重 小弟整理了下 无需积分 编辑的不好 希望帮到你们)
- android 跑马灯 竖线,专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机
- 将knif4j快速集成到springboot项目中
- NCH ExpressDictate for Mac(数字听写记录软件)