nameerror 是因引用未定义的变量、函数、类或模块名所致,主因包括名字未声明、作用域错误、大小写混淆、定义顺序颠倒、导入缺失、字符串误作变量名等。

NameError 是 Python 中最基础也最常遇到的报错之一,本质是“名字没定义就用了”。只要代码里引用了一个 Python 解释器不认识的变量、函数、类或模块名,就会触发这个错误。核心原因只有一个:名字在使用前没有被正确定义或导入。
名字未声明就直接使用
这是最常见的场景。比如写 print(username),但前面压根没写 username = "Alice";或者拼错了变量名,比如定义了 user_name,却写了 print(username)(少个下划线)。
- 检查报错行及上方最近的几行,确认该名字是否真的赋值过
- 注意作用域:函数内定义的变量不能在函数外直接访问,反之亦然
- 区分大小写:Count 和 count 是两个不同名字
函数或类定义顺序错误
Python 是自上而下执行的。如果在函数定义前就调用它,就会报 NameError。例如:
greet() # 报错:name 'greet' is not defined
def greet():
print("Hello")
立即学习“Python免费学习笔记(深入)”;
- 把函数定义移到调用之前(最简单有效)
- 或者把主逻辑封装进 if __name__ == "__main__": 块中,确保定义先于执行
忘记导入模块或从模块中导入名称
想用 os.listdir() 却没写 import os;或者用了 sqrt(4) 却没写 from math import sqrt 或 import math,都会触发 NameError。
- 看到报错提示 “name 'xxx' is not defined”,先查文档确认它属于哪个标准库或第三方包
- 补上对应 import 语句,并注意导入方式是否匹配使用方式(如 import requests 后要用 requests.get(),而不是直接 get())
- 避免滥用 from module import *,容易掩盖命名冲突,也不利于排查
字符串误当变量名,或变量名加了引号
新手常写 print("username") 本意是想打印变量值,结果打印了字面字符串;反过来,想用字符串做变量名却忘了用 globals() 或 locals(),直接写 "username"() 当然报错。
- 引号内的内容永远是字符串,不是变量——去掉引号才能访问变量
- 动态变量名需求较少,真需要时优先考虑字典(如 data["username"]),而非拼接变量名










