Python 3: UnboundLocalError: local variable referenced before assignment [duplicate] Python 3:UnboundLocalError:在分配之前引用本地变量

10 浏览
0 Comments

Python 3: UnboundLocalError: local variable referenced before assignment [duplicate] Python 3:UnboundLocalError:在分配之前引用本地变量

此问题已经有了答案

试图使用一个被(重新)赋值的变量(本应是全局的),导致UnboundLocalError

在函数中使用全局变量

以下代码报错: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()

如何修复这个问题?

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果你在函数内部设置变量的值,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()

0
0 Comments

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

除非必要,否则不建议Python开发人员使用全局变量,因为这会导致困惑和有问题的代码。但是,如果您想使用它们来完成您的代码所示的内容,您只需要在函数的开头添加:

global Var1, Var2

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

一些资源

  • Python 网站有对这个常见问题的 很好的解释
  • Python 3 提供了一个相关的 nonlocal 声明 - 也可以看看。
0