本帖最后由 littleblackLB 于 4-18-2025 16:21 编辑
Python 在函数内部对变量的访问,遵循 Local → Enclosing → Global → Built‑in (简称 LEGB)顺序进行名称解析。 - 读取全局变量:如果函数中仅有对变量的读取操作,不进行赋值,则该变量会被解释为全局变量,直接从全局作用域取值。
- 赋值操作:只要在函数内部出现对某个名字的赋值,Python 就会将其视为局部变量。如果此时再去读取同名全局变量,就会因“局部变量尚未绑定”而报 UnboundLocalError。
- collide_times = 0
- class CLS_ball(object):
- def collide(self, pad):
- # ...
- collide_times += 1</font>
复制代码
由于函数体中出现了 collide_times += 1(相当于 collide_times = collide_times + 1),Python 将 collide_times 视为局部变量。而在计算右侧表达式时,又试图读取同名全局变量,却因局部变量还未被赋值而导致错误。 因此, 无需 global的情况是当函数内部只“读取”全局变量,不含任何赋值语句; 必须 global的情况是当函数内部“写入”或“增量赋值”全局变量时,必须在最开始声明。 |