NameError: name 'xxx' is not defined 表示 Python 在当前作用域未找到变量或函数 xxx 的定义,常见原因包括未赋值、定义位置在使用之后、作用域错误、大小写不一致、字符串漏引号或跨文件导入遗漏。

为什么会出现 NameError: name 'xxx' is not defined?
这个错误说明 Python 解释器在当前作用域里根本没找到变量或函数 xxx 的定义。不是拼写错了,就是它压根还没出现过,或者出现在了不可见的位置。
常见触发场景包括:变量在使用前漏写了赋值;函数定义写在了调用之后;在函数内部试图读取未声明的全局变量;拼写大小写不一致(比如 my_list 和 my_List);或者误把字符串当变量名用了(比如写了 print(xxx) 本意是打印字符串 "xxx")。
检查变量是否真的定义过且拼写一致
最直接的办法是顺着报错行往上翻几行,确认 xxx 是不是被赋值过。注意 Python 区分大小写,Count 和 count 是两个东西。
- 用
Ctrl+F搜索整个文件里xxx =或def xxx(的位置 - 如果在函数里用到了
xxx,但定义在函数外,记得确认是否加了global xxx(仅限修改)或至少确保没缩进错误导致定义被嵌套进别的块里 - 别把引号漏了——
print(xxx)和print("xxx")完全是两回事
函数调用在定义之前会触发这个错误吗?
会,而且很常见。Python 是顺序执行的,def 语句本身不会立即运行,但它必须出现在调用之前,否则解释器在执行到调用时还不知道这个函数存在。
立即学习“Python免费学习笔记(深入)”;
例如这段代码会报错:
my_function()
def my_function():
print("hello")
修复方法很简单:把 def my_function(): 往上挪,放到 my_function() 调用之前。模块级函数定义一般放在文件靠前位置,避免跨函数依赖混乱。
交互式环境(如 IPython/Jupyter)里容易忽略的作用域问题
在 Jupyter Notebook 单元格中,每个单元格是独立执行的,但变量作用域是累积的。如果某个单元格里删掉了 xxx(比如用了 del xxx),后续单元格再用就会报这个错误;或者你改了变量名但没重新运行前面定义它的单元格,也会出问题。
- 按
Kernel → Restart & Run All是最保险的重置方式 - 执行前先用
print(dir())或'xxx' in locals()快速确认变量是否存在 - 避免在不同单元格里反复定义同名变量又不清理,容易掩盖真实定义位置
真正难排查的往往是跨文件导入遗漏或 from module import * 没生效——这时候 xxx 看似“应该有”,其实根本没进当前命名空间。


















