当前位置:   article > 正文

UnboundLocalError: local variable ‘a‘ referenced before assignment(Python报错解决)_unboundlocalerror: local variable 'a' referenced b

unboundlocalerror: local variable 'a' referenced before assignment

问题提出

使用Python编程的时候,要注意函数内可以访问全局变量,但不能更新(修改)其值。

比如:

a = 10
def sum ( n ) :
   n += a
   print ('a = ', a, end = ' , ' )
   print ( 'n = ', n )
  
sum(3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出:

a =  10 , n =  13
  • 1

如果引用了还没更新的值则会报错 。比如函数内部调用了全局变量,但之后又修改了该变量,则会引发 UnboundLocalError错误。

a = 10
def sum ( n ) :
   n += a  # 调用了全局变量a,但是之后又修改了a,引发错误
   a = 11  # 修改了全局变量
   print ('a = ', a, end = ' , ' )
   print ( 'n = ', n )
  
sum(3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出:

---------------------------------------------------------------------------
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 = 10
      2 def sum ( n ) :
----> 3    n += a
      4    a = 11
      5    print ('a = ', a, end = ' , ' )

UnboundLocalError: local variable 'a' referenced before assignment
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

解决办法

办法1:先更新再引用

a = 10
def sum ( n ) :
    a = 11
    n += a
    print ('a = ', a, end = ' , ' )
    print ( 'n = ', n )
  
sum(3)
print ( '外 a = ', a )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出:

a =  11 , n =  14
外 a =  10
  • 1
  • 2

办法2:函数内加上 global 引用以更新变量值

a = 10
def sum ( n ) :
   global a
   n += a
   a = 11
   print ('a = ', a, end = ' , ' )
   print ( 'n = ', n )

sum ( 3 )
print ( '外 a = ', a )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出:

a =  11 , n =  13
外 a =  11
  • 1
  • 2

为什么加上 global就可以了呢?首先认识一下global。

认识global

global关键字可以定义一个变量,被定义的变量可以在变量作用域之外被修改,通俗讲就是一个全局的变量,这个全局的变量在其被定义后,可以在全部上文中修改和使用。当然,global的使用也有一些自己的规则,当我们在函数内部创建一个变量的时候,如果我们想让他变成一个全局变量,我们需要使用关键字global定义它,但是如果我们是在函数外面定义的变量,那么默认就是global的变量,不用再使用global关键字定义。

举个例子。

x = 100   #全局变量

def func_x():
    x = x + 1
    print(x)

func_x()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出:

---------------------------------------------------------------------------
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 + 1
      5     print(x)
      6 

UnboundLocalError: local variable 'x' referenced before assignment
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

分析
在这个例子中设置的 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 x
    x = x + 1
    print(x)

func_x()
print('外 x = ', x )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出:

101
外 x =  101
  • 1
  • 2

另外需要注意的是,global 关键字会跳过中间层直接将嵌套作用域内的局部变量变为全局变量。

测试如下:

num = 20

def outer():
    num = 10
    def inner():
        global num
        print("第1个num:",num)
        num = 100
        print("第2个num:",num)
    inner()
    print("第3个num:",num)
    
outer()

print('外 num = ', num )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出:

1个num: 202个num: 1003个num: 10
外 num =  100
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/442476
推荐阅读
相关标签
  

闽ICP备14008679号