← 中文资源

简体中文版本

Python NameError: name is not defined

修复 Python 的 NameError:变量或函数在定义之前被引用,或在函数、类中不在正确作用域内。

阅读英文原文

症状

出现 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。为原先失败的分支补充一个测试,把修复固化下来。