Python 3:unbundlocalerror:assignmen之前引用的局部变量

2024-04-26 11:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码给出了错误UnboundLocalError: local variable 'Var1' referenced before assignment

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

我该怎么解决?谢谢你的帮助!


Tags: and代码local错误functionresultvariableprint
3条回答

如果在函数中设置变量的值,python会将其理解为使用该名称创建局部变量。这个局部变量掩盖了全局变量。

在您的例子中,Var1被视为一个局部变量,在设置之前使用它,因此出现错误。

要解决这个问题,可以通过在函数中放入global Var1来显式地说它是全局的。

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

这是因为,即使存在Var1,您也在函数内部的名称Var1上使用赋值语句(在底线处为Var1 -= 1)。自然,这会在函数的作用域内创建一个名为Var1的变量(实际上,-=+=将只更新(重新分配)一个现有变量,但由于未知的原因(在此上下文中可能是一致性),Python将其视为一个赋值。Python解释器在模块加载时看到这一点,并决定(正确地)全局作用域的Var1不应在本地作用域内使用,这会导致在本地分配变量之前尝试引用变量时出现问题。

Python开发人员通常不喜欢在必要的情况下使用全局变量,因为这会导致代码混乱和有问题。但是,如果您想使用它们来完成代码的含义,只需添加:

global Var1, Var2

在你的函数顶部。这将告诉Python您不打算在函数的本地作用域内定义Var1Var2变量。Python解释器在模块加载时看到这一点,并决定(正确地说)在全局范围内查找对上述变量的任何引用。

一些资源

  • Python网站对这个常见问题有一个great explanation
  • Python 3提供了一个相关的^{}语句——也可以检查一下。

可以通过传递参数而不是依赖全局参数来解决此问题

def function(Var1, Var2): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1
function(1, 1)

相关问题 更多 >