我有一个名为Y_VAL的全局变量,它被初始化为值2.
然后我有一个函数,称为f()(为简洁起见),它使用Y_VAL。
def f():
y = Y_VAL
Y_VAL += 2
但是,在尝试运行我的代码时,python会给出错误消息:
UnboundLocalError: local variable 'Y_VAL' referenced before assignment
如果我删除最后一行Y_VAL += 2
,它可以正常工作。
为什么python认为Y_VAL是局部变量?
答案 0 :(得分:14)
你错过了函数内的global Y_VAL
行。
当Y_VAL
出现在赋值的右侧时,没有问题,因为首先搜索本地范围,然后搜索全局范围。但是,在左侧,当您明确声明global Y_VAL
时,您只能将分配给全局。
来自the docs:
在没有全局变量的情况下分配给全局变量是不可能的,尽管自由变量可以引用全局变量而不被声明为全局变量。
答案 1 :(得分:1)
这就是Python的工作原理:Assignment总是绑定最近的名字空间中的左侧名称。在函数内部,最近的命名空间是函数的本地命名空间。
为了分配全局变量,您必须声明它global
。但是一定要避免global
。全局变量几乎总是糟糕的设计,因此使用global
关键字是一个强烈暗示,你正在犯设计错误。
答案 2 :(得分:0)
在遇到需要全局声明之前,我遇到了和你以及许多其他人一样的问题。然后,我决定将所有内容都移到面向对象的位置,并且有一点心思。叫我疯了,但我不相信自己的全局声明,并且不难解决本地范围的问题,这是一个很难调试。
所以我建议收集你所有的“全局”变量,将它们放在 init (自我)中的一个类中,不仅你不必担心本地范围,而且你的代码会很多组织得更好。大多数程序员都不喜欢OOP,这不是一个好运的怪物。