为什么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 个回答
1
我也遇到过和你一样的问题,很多人都碰到过,后来才意识到需要用到全局变量声明。于是我决定把所有东西都改成面向对象的方式,这样心里也踏实。你可以说我疯了,但我就是不太信任全局变量,遇到局部作用域的问题时,调试起来真的很麻烦。
所以我建议把你所有的“全局”变量放到一个类里面,在init(self)里,这样你不仅不用担心局部作用域的问题,而且代码也会更有条理。大多数程序员都喜欢面向对象编程,这可不是偶然的。
2
这就是Python的工作方式:赋值操作总是把左边的名字绑定到最近的名字空间。在一个函数内部,最近的名字空间就是这个函数的局部名字空间。
如果你想给一个全局变量赋值,你必须先声明它为global
。不过尽量避免使用global
。全局变量几乎总是设计不好的表现,因此使用global
这个关键词,通常意味着你可能在设计上犯了错误。
16
你在函数里面缺少了这一行 global Y_VAL
。
当 Y_VAL
出现在赋值的右边时,不会有问题,因为程序会先在本地查找这个变量,如果找不到再去全局查找。但是如果 Y_VAL
出现在赋值的左边,你必须先明确声明 global Y_VAL
,才能这样给全局变量赋值。
根据文档的说明:
如果没有声明为 global,就不可能给全局变量赋值,虽然不需要声明的自由变量可以引用全局变量。