附录 A:常见报错速查
报错不可怕,它是 Python 在告诉你哪里出了问题。怎么读报错信息:
Traceback (most recent call last):
File "test.py", line 3, in <module> ← 出错的文件和行号
print(10 / 0) ← 出错的那行代码
ZeroDivisionError: division by zero ← 错误类型:错误说明(最重要,先看这行)
从最后一行往上看:先看错误类型和说明,再根据行号定位代码。
SyntaxError 语法错误
含义:代码写法不符合 Python 语法,程序根本没开始运行。
常见原因:
| 症状 | 原因 |
|---|---|
invalid character '(' | 用了中文标点(括号、引号、逗号) |
expected ':' | if/for/while/def 行末忘写冒号 |
unterminated string literal | 引号没配对,少了一半 |
invalid syntax 指向 = | 判断相等写成了 =,应为 == |
'(' was never closed | 括号没配对 |
IndentationError 缩进错误
含义:缩进不对。
if age > 18:
print("成年") # ❌ expected an indented block:冒号后必须缩进
- 同一层级的代码缩进必须完全一致(都用 4 个空格)
- 不要 Tab 和空格混用(VS Code 默认帮你处理好了)
NameError 名字错误
含义:用了一个不存在的变量或函数名。
NameError: name 'pirnt' is not defined
常见原因:拼写错误(pirnt → print)、变量还没赋值就使用、大小写不对(True 写成 true)。
TypeError 类型错误
含义:对某种类型做了它不支持的操作。
| 报错 | 原因与解法 |
|---|---|
can only concatenate str (not "int") to str | 字符串 + 数字。解法:"age: " + str(18) 或用 f-string |
'str' object is not callable | 常见于把 print 等内置名当变量用了:print = 5 之后 print 就坏了。别用内置函数名当变量名 |
takes 0 positional arguments but 1 was given | 类的方法忘了写 self |
'int' object is not iterable | for i in 5: 应为 for i in range(5): |
ValueError 值错误
含义:类型对但值不对。
ValueError: invalid literal for int() with base 10: 'abc'
最常见于 int(input()) 时用户输入了非数字。解法:用 try...except 包住(见第 8 章)。
IndexError 索引越界
IndexError: list index out of range
列表只有 3 个元素,你却访问 lst[3](最大合法索引是 2)。检查索引范围,记住索引从 0 开始。
KeyError 键不存在
KeyError: 'phone'
字典里没有这个键。解法:先用 in 判断,或改用 d.get("phone", 默认值)。
FileNotFoundError 文件不存在
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
常见原因:
- 文件名拼错、后缀写错(
data.txt.txt的惨案:Windows 隐藏了扩展名) - 文件不在当前工作目录。程序找文件是从"运行程序时所在的目录"找的,不一定是 py 文件所在目录。最稳妥的办法是用完整路径,或在 VS Code 中设置 Execute in file dir
ModuleNotFoundError 模块不存在
ModuleNotFoundError: No module named 'requests'
- 第三方库没安装 →
pip install requests - 自己的模块名拼错,或不在同一目录
- ⚠️ 自己的文件名和库重名(比如你建了个
random.py,再import random导入的是你自己的文件)——不要用库名给自己的文件命名
UnicodeDecodeError 编码错误
UnicodeDecodeError: 'gbk' codec can't decode byte...
Windows 上读中文文件的经典报错。解法:open() 时永远写上 encoding="utf-8"。
ZeroDivisionError 除以零
ZeroDivisionError: division by zero
除数是 0。在除法前判断,或用 try...except。
排错通用流程
- 看报错最后一行:什么类型?说明写了什么?
- 看行号:定位到出错的那一行(有时真正的错在它上面几行,比如少了括号)
- 读不懂就搜:把报错最后一行原样复制去搜索引擎 / 问 AI
- 打印大法:在可疑位置加
print(变量, type(变量)),看看变量到底是什么