Local variable referenced before assignment

时间:2020-02-23 14:42:19  来源:igfitidea点击:

在本教程中,我们将了解Python中的error"Local variable referenced before assignment"。赋值前引用了局部变量

问题

让我用一个例子来解释这个错误。

a = 100
def incrementA():
    a=a+5
    return a
print("value of a:",incrementA())

当我们运行上述程序时,我们将得到以下输出:

--------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-89-c87da0a8ced6> in <module>
      3     a=a+5
      4     return a
----> 5 print("value of a:",incrementA())
 
<ipython-input-89-c87da0a8ced6> in incrementA()
      1 a = 100
      2 def incrementA():
----> 3     a=a+5
      4     return a
      5 print("value of a:",incrementA())
 
UnboundLocalError: local variable 'a' referenced before assignment

让我们理解为什么会出现这个错误"UnboundLocalError"。

当Python解释器解析任何函数定义并找到任何赋值时,例如

a =

Python解释器默认将"a"视为局部变量。

因为'a'被认为是局部变量,所以当python执行时

a=a+5

它首先计算右边的值,并试图找到变量"a"的值。
它第一次找到'a',因此引发了以下错误:'UnboundLocalError:赋值前引用的局部变量"

解决方案

使用全局

要解决这个问题,我们需要显式地将一个变量声明为全局变量,它将解决这个问题。

让我们在程序中实现这个解决方案。

a = 100
def incrementA():
    global a
    a=a+5
    return a
print("value of a:",incrementA())

当我们运行上述程序时,我们将得到以下输出:

value of a: 105

如我们所见,在incrementA()函数中声明了global a之后,我们解决了这个问题。

请注意,如果不将赋值与变量一起使用,则不会出现此错误。	

a = 100
def incrementA():
    return a
print("value of a:",incrementA())
 

当您运行上述程序时,您将得到以下输出:
a值:100
如果使用直接赋值而不使用变量,那么也不会出现此错误。
 
a = 100
def incrementA():
    a=200
    return a
print("value of a:",incrementA())
 

当您运行上述程序时,您将得到以下输出:
value of a: 200

使用非本地

如果使用嵌套函数,则可以使用"nonlocal"来解决此问题"nonlocal"用于嵌套函数,通常在变量不应属于内部函数时使用。

a = 100
def incrementA():
    a = 200
    def incrementABy10():
        # will refer a=200
        nonlocal a
        a=a+10
        print("value of a inside function:",a)
        
    incrementABy10()
    a=a+5
    return a
print("value of a:",incrementA())

输出:

value of a inside function: 210
value of a: 215

当我们使用"nonlocal"时,它引用最近的封闭范围中的值。

让我们把"nonlocal"改成"global",你就能理解其中的区别了。

a = 100
def incrementA():
    a = 200
    def incrementABy10():
        # will refer a=100
        global a
        a=a+10
        print("value of a inside function:",a)
        
    incrementABy10()
    # will refer a as 200
    a=a+5
    return a
print("value of a:",incrementA())

如我们所见,由于"global a",所以 "incrementABy10()"中的"a"的值是100,然后增加了10,当我们使用"incrementA()" 中的"a"时,它是200,因为"a"在这里被认为是局部变量,然后增加了5.