局部变量 'w1' 在赋值之前被引用。
这是因为,尽管Var1
存在,但你在函数内部也使用了一个赋值语句给名为Var1
的变量(最后一行的Var1 -= 1
)。自然地,这在函数的作用域内创建了一个名为Var1
的变量(实际上,-=
或+=
只会更新(重新分配)一个已存在的变量,但由于未知原因(可能是一致性),Python将其视为赋值)。Python解释器在模块加载时就会发现这个问题,并且正确地决定全局作用域的Var1
不应在局部作用域内使用,这导致在变量在局部分配之前尝试引用它时出现问题。
除非必要,否则在Python开发者中通常不鼓励使用全局变量,因为这会导致令人困惑和问题多多的代码。然而,如果你想要使用它们来完成代码所暗示的功能,你可以在函数的开头添加以下代码:
global Var1, Var2
这将告诉Python你不打算在函数的局部作用域中定义Var1
或Var2
变量。Python解释器在模块加载时会发现这一点,并决定在全局作用域中查找对这些变量的任何引用。
一些资源提示你可以参考:
- Python官方网站有一个非常好的解释,针对这个常见问题提供了一个详细解释。
- Python 3提供了一个相关的nonlocal
语句,也可以查看一下。
确实,理想情况下,回答应该解释实际示例中正在发生的情况,以及如何修复,而不是建议完全不同的方法。
"自然地"对我来说并不自然。我只是指+=
是一个赋值运算符(iadd
,即“原地相加”)。
解释得很清楚,并提供了可行的解决方法。
有没有类似问题的过程?我想研究一下其他语言是否会做类似的事情,但我不确定该搜索什么。