🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【Python初学者必看】IndentationError并不可怕!前新手为您讲解原因与快速解决方法

大家好!几个月前我还是个编程零基础的小白,但在AI的帮助下,我花了一个半月的时间独立创建了两个网站。本文将根据我的经验,为各位初学者讲解容易卡壳的地方。

开始学习Python时,很多人最先遇到的可能就是红色的错误信息……其中,最让人挠头、想不通“咦,为什么?哪里错了?”的,恐怕就是我们这次要讲解的 IndentationError 了。

我一开始也是这样。曾经因为一个空格的问题浪费了好几个小时,甚至想过“我是不是不适合编程……”。但请放心,读完这篇文章,IndentationError将不再可怕。它的原因非常简单,一旦理解了,就再也不会迷茫了。

在本文中,我将结合自己的踩坑经验,以“同为新手”的视角,为您深入讲解错误的原因、解决方法,以及如何避免再次被这个错误困扰的预防措施。我准备了很多复制粘贴就能运行的代码,让我们一起来体验“代码跑起来了!”的快感吧!


话说回来,为什么Python对缩进如此严格?

接触过其他编程语言(例如JavaScript或C语言)的朋友可能会感到奇怪:“为什么只有Python会因为缩进(indentation)报错?”

在许多语言中,代码的“块”是用 { } (花括号) 括起来的。像这样:

// 这是JavaScript的示例
if (x > 10) {
  console.log("x大于10。");
  console.log("这一行也属于同一个代码块。");
}

有了 { }if 语句的内容范围就一目了然了。即使缩进乱七八糟,程序也能运行。

而Python的设计哲学是“可读性强的代码就是好代码”。为了让任何人写的代码都同样简洁易读,Python采用了使用缩进而不是 { } 来表示代码块的规则。

也就是说,对Python而言,缩进不仅仅是美观问题,它本身就是决定代码结构的语法

跟在冒号(:)后面,缩进一级的代码块。这就是Python中“代码块”的标志。

# 这是Python的示例
age = 20
if age >= 20:
    # 这部分被缩进了,所以是 if 的“代码块”
    print("您是成年人。")
    print("可以喝酒抽烟。")
# 这部分没有缩进,所以在 if 之外
print("程序结束。")

IndentationError 三大常见原因及完全解决手册

那么,我们来看看导致 IndentationError 的三个典型原因及其解决方法。

原因1:缺少缩进 (expected an indented block)

这是Python在告诉您:“这里需要一个缩进块!”。在以冒号(:)结尾的行之后,例如 iffordefclass 等,下一行必须进行缩进。

常见错误 👎

# 会导致错误的代码
name = "Taro"
if name == "Taro":
print("你好,Taro!") # if 之后的下一行没有缩进

运行这段代码,会产生 IndentationError: expected an indented block 错误。

解决方法 👍
将冒号(:)后的下一行缩进四个半角空格。在大多数编辑器中,按一次Tab键会自动输入四个空格。

像念咒语一样记住:“冒号后面,降一级”。

# 可以正常运行的代码
name = "Taro"
if name == "Taro":
    # 用四个半角空格缩进
    print("你好,Taro!") 

原因2:多余的缩进 (unexpected indent)

这个和刚才的情况相反,是Python在吐槽:“这里不需要缩进啊……”。无缘无故地进行缩进就会导致这个错误。

常见错误 👎

# 会导致错误的代码
print("开始处理。")
    print("这行不知为何被缩进了。") # 没有理由的缩进
print("处理结束。")

运行这段代码,会产生 IndentationError: unexpected indent 错误。

解决方法 👍
缩进只用于表示if语句或for语句等代码块的开始。在其他地方,请从行首开始编写代码。

记住“同一级别的处理,放在同一列”就很容易理解了。

# 可以正常运行的代码
print("开始处理。")
print("这行不缩进。") # 删除了缩进
print("处理结束。")

原因3:空格与制表符(Tab)混用 (tab error)

这是对初学者来说最棘手的“隐形敌人”。即使看起来缩进相同,但如果某一行是用“四个空格”缩进,而另一行是用“一个Tab键”缩进,Python就会混淆并报错。

从网上复制粘贴代码时经常会发生这种情况。我也因此浪费了很多时间……

解决方法 👍
要解决这个问题,首先需要让“敌人”现形。您使用的代码编辑器(如Visual Studio Code)通常都有显示空格和制表符的功能

例如,在VS Code中,可以从“查看”菜单中选择“渲染空白字符”,或者在设置中设为 "editor.renderWhitespace": "all",这样空格就会显示为点(·),制表符会显示为箭头(→)。

在Visual Studio Code中将空白字符可视化的示例。空格显示为点,制表符显示为箭头。 (图片为空白字符可视化示意图)

可视化之后,找到混用缩进的地方,全部统一为“四个空格”。许多编辑器也有一键将整个文件的制表符转换为空格的功能。

Python的官方编码规范(PEP 8)也强烈推荐使用四个空格进行缩进。除非有特殊理由,否则应遵循此规则。

# 推荐的写法
def my_function():
    # 这个缩进是四个空格
    print("已用四个空格缩进。")
    if True:
        # 这个缩进是八个空格 (4 * 2)
        print("嵌套时再增加四个空格。")

【AI时代的学习方法】向AI咨询IndentationError的技巧

当出现错误时,向ChatGPT这样的AI求助是非常有效的手段。我平时也经常使用。但是,提问方式不同,得到的回答质量也会大相径庭。

糟糕的提问示例 👎

我遇到了IndentationError,请帮我修复。

这样提问,AI会因信息不足而只能给出一般性的回答。

优秀的提问示例(Prompt) 👍

运行以下Python代码时,出现了 `IndentationError: expected an indented block` 错误。

1. 错误的原因是什么?
2. 应该如何修改哪一行?请提供修改后的完整代码。

▼ 导致错误的代码

# 在此处粘贴您的代码
name = "Taro"
if name == "Taro":
print("你好,Taro!")

像这样,将以下信息一并提供:

  1. 具体的错误信息
  2. 导致错误的完整代码
  3. 想知道什么(原因和修改方案)

AI就能准确理解您的情况,并给出精准的解决方案。让我们把AI当作优秀的私人家庭教师来活用吧。


不再犯错!永久预防缩进错误的措施

最后,我将介绍一个最强大的预防措施,从根本上避免 IndentationError 的发生。

那就是引入代码格式化工具(Code Formatter)

Python有 `Black`、`autopep8` 等工具,可以在每次保存时自动将代码格式化为符合PEP 8规范的优美形式。

只要在您的代码编辑器中进行设置,缩进偏差或空格与制表符混用的问题,都会在保存文件的瞬间被自动修正。您将从手动修正缩进的繁琐工作中彻底解放出来,可以专心思考逻辑。

通过搜索“VSCode Black 设置”等关键词,可以找到大量关于安装方法的教程文章。这一小步的努力,将在未来为您节省数十个小时的开发时间。


总结:缩进是Python的“礼仪”

这次,我结合自己的经验,讲解了 IndentationError 的原因和解决方法。

缩进就像是Python这门语言的“礼仪”。一开始可能会觉得有点束缚,但习惯了这种礼仪后,您就能写出对任何人来说都易于阅读和维护的优美代码。

克服了这个错误,您在成为Python大师的道路上又前进了一步。让我们一起继续学习吧!

下一步

掌握了缩进之后,下一个经常遇到的就是语法本身的错误 `SyntaxError`。让我们来学习一下忘记闭合括号或忘记加冒号等常见模式及其解决方法吧。

→ 阅读下一篇文章:SyntaxError(语法错误)的常见错误与修正方法