症状
出现 NameError: name 'x' is not defined。它常发生在某个先于赋值执行的分支上,或在代码在作用域之间移动之后。
诊断
阅读 traceback:它会指出缺失的名字以及读取该名字的行。随后检查实际存在哪些绑定:
def f():
print(sorted(globals().keys()))
return value # NameError if value defined later
如果函数在任意位置对该名字赋值,那么它在整个函数内都是局部变量。
修复
先定义后使用,并覆盖所有分支:
value = 0
def f():
global value
value += 1 # needs the global declaration
return value
尽量少用 global,优先以参数传入、以返回值传出。
验证
重新运行代码,确认不再报 NameError。为原先失败的分支补充一个测试,把修复固化下来。