局部变量 'w1' 在赋值之前被引用。

7 浏览
0 Comments

局部变量 'w1' 在赋值之前被引用。

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

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result 1")
    elif Var2 == 1 and Var1 > 0:
        print("Result 2")
    elif Var1 < 1:
        print("Result 3")
    Var1 -= 1
function()

我该如何解决这个问题?

0
0 Comments

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

除非必要,否则在Python开发者中通常不鼓励使用全局变量,因为这会导致令人困惑和问题多多的代码。然而,如果你想要使用它们来完成代码所暗示的功能,你可以在函数的开头添加以下代码:

global Var1, Var2

这将告诉Python你不打算在函数的局部作用域中定义Var1Var2变量。Python解释器在模块加载时会发现这一点,并决定在全局作用域中查找对这些变量的任何引用。

一些资源提示你可以参考:

- Python官方网站有一个非常好的解释,针对这个常见问题提供了一个详细解释

- Python 3提供了一个相关的nonlocal语句,也可以查看一下。

确实,理想情况下,回答应该解释实际示例中正在发生的情况,以及如何修复,而不是建议完全不同的方法。

"自然地"对我来说并不自然。我只是指+=是一个赋值运算符(iadd,即“原地相加”)。

解释得很清楚,并提供了可行的解决方法。

有没有类似问题的过程?我想研究一下其他语言是否会做类似的事情,但我不确定该搜索什么。

0