IndentationError: unexpected indent 指某行缩进突兀变深且无法匹配上最近可缩进语句,主因是空格与Tab混用或误加缩进;需开启显示空白字符、统一转为空格并禁用Tab。

为什么Python会报 IndentationError: unexpected indent?
这不是语法错误,而是Python解析器在读取代码时,发现某行缩进“突兀地变深了”,且无法匹配上最近的可缩进语句(比如 if、for、def、class 或冒号后的块起始)。根本原因是缩进不一致或误加空格/Tab。
- 常见诱因:用空格写了几行,又不小心按了 Tab 键;复制粘贴代码时混入不可见的全角空格或制表符
- 编辑器显示可能欺骗你——很多编辑器默认把 Tab 渲染成 4 个空格,但Python解释器认的是字节值:
\t≠ - 该错误一定发生在报错行本身,不是上一行;但根源往往在上一个块的开头或结尾
如何快速定位并修复这行“意外缩进”?
别靠肉眼数空格。打开编辑器的“显示空白字符”功能(VS Code:Ctrl+Shift+P → “Toggle Render Whitespace”;PyCharm:File → Settings → Editor → General → Appearance → ✔ Show whitespaces)。
- 重点检查报错行及其前一行:是否出现
\t(标为箭头→)和空格(标为点·)混用 - 确认报错行是否本不该缩进——比如写在模块顶层却多缩进了4个空格,或
return前多了空格 - 用快捷键统一转空格:VS Code 中选中代码 → Shift+Alt+F(需配置
"editor.insertSpaces": true);PyCharm:Code → Convert Indents → To Spaces
if/for/def 块内缩进混乱的典型场景
这类结构要求子句严格对齐,且必须比父级多缩进(通常是4空格),少或多都会出错。尤其注意嵌套时的层级关系。
-
if x > 0:后必须换行+缩进,不能写成if x > 0: print(x)(单行允许,但后面不能再跟缩进行) - 嵌套
if时,第二层缩进应是8空格(非4),若某行只缩进4空格,就会触发unexpected indent - 函数体第一行如果用了
pass占位,它必须缩进;但如果删掉pass又忘了缩进后续代码,下一行就变成“意外缩进”
def calc():
if a == b:
return True
else:
return False # 这行若缩进只有2空格,就会报 unexpected indent预防缩进问题的硬性习惯
靠事后调试不如从源头掐断。Python项目里缩进不是风格问题,是语法刚需。
立即学习“Python免费学习笔记(深入)”;
- 项目根目录放
.editorconfig,强制统一:indent_style = space、indent_size = 4 - 启用flake8或ruff检查:它们会在保存时提示
E111(indent is not a multiple of four)、E117(over-indented)等细节问题 - 绝对不用Tab键写Python——关掉编辑器的“Tab键插入Tab字符”选项,设为“插入空格”
最麻烦的情况是混合了空格与Tab,且错误藏在长文件中间——这时候靠 python -m tabnanny your_file.py 能直接定位到具体行号,比看报错信息更快。


















