什么是 NameError?
NameError 是 Python 解释器在执行代码时抛出的一种运行时错误,它的核心意思是:“你尝试使用了一个名字(比如变量名、函数名),但我(解释器)从未见过或定义过这个名字。”

就是你用了一个“不存在的”或“未被定义的”标识符。
NameError 的常见原因及示例
变量在使用前未被定义(最常见的原因)
这是最典型的 NameError 场景,你直接使用了一个变量,但没有先给它赋值。
错误示例:
# 尝试打印一个从未被赋值的变量 print(my_variable)
执行结果:

Traceback (most recent call last):
File "your_script_name.py", line 2, in <module>
print(my_variable)
NameError: name 'my_variable' is not defined
错误分析:
当 Python 看到 print(my_variable) 时,它会去内存中查找名为 my_variable 的变量,但因为你从未创建过它(即没有通过 my_variable = ... 赋值),Python 找不到,于是抛出 NameError,并提示 name 'my_variable' is not defined。
如何修正:
在使用变量之前,必须先给它赋一个初始值。
# 1. 先定义变量 my_variable = "Hello, Python!" # 2. 再使用变量 print(my_variable) # 输出: Hello, Python!
函数名拼写错误
你可能定义了一个函数,但在调用时把名字拼错了。

错误示例:
def calculate_sum(a, b):
return a + b
# 调用时函数名拼写错误
result = calculte_sum(10, 5) # 注意 'culate' 拼错了
print(result)
执行结果:
Traceback (most recent call last):
File "your_script_name.py", line 5, in <module>
result = calculte_sum(10, 5)
NameError: name 'calculte_sum' is not defined
错误分析:
Python 解释器知道 calculate_sum 这个函数,但你调用的是 calculte_sum,由于这个名字不存在,所以它报错了。
如何修正: 仔细检查并修正函数名的拼写。
def calculate_sum(a, b):
return a + b
# 正确调用
result = calculate_sum(10, 5)
print(result)
# 输出: 15
函数在被调用前未被定义
在 Python 中,代码是自上而下执行的,如果你在定义一个函数之前就尝试调用它,就会出错。
错误示例:
# 尝试调用一个尚未定义的函数
do_something()
# 函数的定义在调用之后
def do_something():
print("Doing something...")
执行结果:
Traceback (most recent call last):
File "your_script_name.py", line 2, in <module>
do_something()
NameError: name 'do_something' is not defined
错误分析:
当 Python 解释器执行到 do_something() 时,它还没有“看到”下面的 def do_something(): 定义,所以它认为 do_something 这个名字不存在。
如何修正: 将函数的定义移到调用它的代码之前。
# 1. 先定义函数
def do_something():
print("Doing something...")
# 2. 再调用函数
do_something()
# 输出: Doing something...
作用域问题
变量和函数只能在它们被定义的“作用域”内访问,如果你在函数内部使用了一个在函数外部定义的变量,但没有通过参数传递,或者你在函数外部尝试访问一个只在函数内部定义的变量,都会导致 NameError。
错误示例 1:在函数内部访问全局变量(未声明为全局)
global_var = "I am global"
def my_function():
# 尝试修改全局变量,但未声明 global
# 如果只是读取,通常可以访问,但修改时会出问题
# 如果变量不存在,则会报错
print(local_var) # local_var 未定义
my_function()
执行结果:
Traceback (most recent call last):
File "your_script_name.py", line 7, in <module>
my_function()
File "your_script_name.py", line 5, in my_function
print(local_var)
NameError: name 'local_var' is not defined
错误示例 2:在函数外部访问局部变量
def my_function():
local_var = "I am local"
print(local_var)
my_function()
print(local_var) # 尝试在函数外部访问局部变量
执行结果:
I am local
Traceback (most recent call last):
File "your_script_name.py", line 7, in <module>
print(local_var)
NameError: name 'local_var' is not defined
错误分析:
local_var 是在 my_function 函数内部定义的,它的生命周期仅限于函数被调用的那一刻,函数执行完毕后,这个变量就被销毁了,因此在函数外部无法访问。
如何修正:
- 如果需要在函数间共享数据,通过参数传递和返回值。
- 如果需要在函数内部修改全局变量,使用
global关键字(但要谨慎使用)。
导入模块时出错
当你使用 import 语句时,如果模块名拼写错误,或者模块没有被正确安装,也会导致 NameError。
错误示例:
# 模块名拼写错误 import datatime # 正确的是 datetime # 尝试使用模块内的函数 now = datatime.datetime.now() print(now)
执行结果:
Traceback (most recent call last):
File "your_script_name.py", line 5, in <module>
now = datatime.datetime.now()
NameError: name 'datatime' is not defined
错误分析:
Python 尝试寻找名为 datatime 的模块,但找不到(因为标准库里是 datetime)。datatime 这个名字是“未定义的”。
如何修正: 检查并修正模块名。
# 正确的导入 import datetime now = datetime.datetime.now() print(now)
如何调试 NameError?
当遇到 NameError 时,遵循以下步骤通常能快速解决问题:
-
仔细阅读错误信息:错误信息会告诉你出错的文件名、行号,以及具体是哪个名字没有被定义 (
name 'xxx' is not defined),这是最重要的线索。 -
检查拼写:100% 的情况下,首先检查出错的那个名字(变量、函数、模块)的拼写是否完全正确,大小写、下划线等都不能错。
-
检查定义位置:
- 确认变量在使用前是否已经赋值。
- 确认函数在被调用前是否已经定义。
- 如果代码很长,使用 IDE 的“转到定义”(Go to Definition)功能来快速定位。
-
检查作用域:
- 如果错误发生在函数内部,确认你访问的变量是否在当前作用域内可用。
- 如果错误发生在函数外部,确认你访问的变量是否不是局部变量。
-
使用
print()或调试器:- 在可能出错的代码前,打印出相关的变量或函数名,看看它们是否存在。
- 对于复杂问题,使用 Python 的
pdb调试器或 IDE 自带的图形化调试器,可以让你一步步执行代码,观察变量状态。
NameError 是一个“友好”的错误,因为它非常直接地指出了问题所在:名字用错了,只要你掌握了它的几个常见原因,并养成“先定义,后使用”的良好编程习惯,就能轻松地避免和解决这类错误。
