为什么python认为这是一个局部变量?

时间:2010-07-13 22:06:11

标签: python

我有一个名为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是局部变量?

3 个答案:

答案 0 :(得分:14)

你错过了函数内的global Y_VAL行。

Y_VAL出现在赋值的右侧时,没有问题,因为首先搜索本地范围,然后搜索全局范围。但是,在左侧,当您明确声明global Y_VAL时,您只能分配给全局。

来自the docs

  

在没有全局变量的情况下分配给全局变量是不可能的,尽管自由变量可以引用全局变量而不被声明为全局变量。

答案 1 :(得分:1)

这就是Python的工作原理:Assignment总是绑定最近的名字空间中的左侧名称。在函数内部,最近的命名空间是函数的本地命名空间。

为了分配全局变量,您必须声明它global。但是一定要避免global。全局变量几乎总是糟糕的设计,因此使用global关键字是一个强烈暗示,你正在犯设计错误。

答案 2 :(得分:0)

在遇到需要全局声明之前,我遇到了和你以及许多其他人一样的问题。然后,我决定将所有内容都移到面向对象的位置,并且有一点心思。叫我疯了,但我不相信自己的全局声明,并且不难解决本地范围的问题,这是一个很难调试。

所以我建议收集你所有的“全局”变量,将它们放在 init (自我)中的一个类中,不仅你不必担心本地范围,而且你的代码会很多组织得更好。大多数程序员都不喜欢OOP,这不是一个好运的怪物。