问题提出

使用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报错解决)相关推荐

  1. python UnboundLocalError: local variable 'log_f' referenced before assignment 错误

    在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...

  2. python 错误--UnboundLocalError: local variable 'num' referenced before assignment

    val = 9 def test(flag): if flag: val = 1 else: print("test") return val if __name__ == '__ ...

  3. 【debug】UnboundLocalError local variable a referenced before assignment

    1)下面这种情况是不会报错的: >>> x = 10 >>> def bar(): ... print(x) >>> bar() 10 (2)但是 ...

  4. UnboundLocalError: local variable ‘loss’ referenced before assignment解决方法

    UnboundLocalError: local variable 'loss' referenced before assignment 文章目录 UnboundLocalError: local ...

  5. 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 ...

  6. UnboundLocalError: local variable 'end_page' referenced before assignment

    UnboundLocalError: local variable 'end_page' referenced before assignment 错误信息是在指出一个在使用之前没有赋值的局部变量.在 ...

  7. 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment

    总结: 内部函数,不修改全局变量可以访问全局变量 内部函数,修改同名全局变量,则python会认为它是一个局部变量 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbou ...

  8. Python 读写当前路径下文件错误 UnboundLocalError: local variable 'file' referenced before assignment

    python读取文件是个比较常用的操作,最近我在读取文件的时候却遇到下面这个问题. 我的代码是: try:file = open("./logs/test")... finally ...

  9. UnboundLocalError: local variable ‘Num_fSu‘ referenced before assignment

    在计算中调用 函数 calculate_psd 的时候,报了如下错误 def calculate_psd(Num_Tai, np_Tai, nr_in_10, Num_sub, dt, Tai) -& ...

最新文章

  1. R数据导入导出(一): read.table()和read.csv()的区别
  2. php+数学计算公式,PHP数学计算函数总结
  3. 如何从服务器导出文件,如何从云服务器导出文件
  4. DISCUZ开启设计插件功能和显示嵌入点功能
  5. jsp调用controller方法_SpringMVC五大核心组件及调用过程
  6. What is the usage of Transfer field in Text determine procedure customizing
  7. 什么是js的严格模式
  8. 资源放送丨《 MySQL中的索引探究 - 2020云和恩墨大讲堂》PPT视频
  9. WF4.0实战(九):猜数字游戏,测下你的智力
  10. java多线程基础_java线程基础
  11. sql数据库身份验证登录
  12. 如何编写makefile文件
  13. 虚拟机安装Linux,设置固态ip,静态ip地址,docker安装
  14. Java入门级项目 汽车租赁系统
  15. cmake:cmake_policy命令
  16. SublimeText 3.2.3207 汉化破解免安装版(3264位)
  17. Apache shiro 官方API (中文版)(承蒙大佬们看重 小弟整理了下 无需积分 编辑的不好 希望帮到你们)
  18. android 跑马灯 竖线,专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机
  19. 将knif4j快速集成到springboot项目中
  20. NCH ExpressDictate for Mac(数字听写记录软件)

热门文章

  1. Sun Solaris 培训教材
  2. LeetCode 图解 | 42. 接雨水
  3. 【附源码】计算机毕业设计java综合售楼系统设计与实现
  4. 63、GIRAFFE: Representing Scenes as Compositional Generative Neural Feature Fields
  5. 头文件如何来关联源文件?
  6. 给大家推荐一个Vue 单页面程序无法SEO的解决办法
  7. 深度学习神经网络实践:基于LSTM的电离层预报
  8. 七星配资新能源车强者恒强
  9. 射雕英雄传入选北京朝阳区小学图书馆基本书目
  10. 烤仔说NFT | 年轻人的第一个NFT该如何拥有?