缩进错误:未对齐缩进与任何外部缩进级别匹配,尽管缩进看起来正确。

793
当我编译下面的Python代码时,我得到以下错误:

IndentationError: unindent does not match any outer indentation level


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

为什么?

12
我遇到了同样的错误,但是我碰巧将一个方法在代码中向左缩进了一些,这导致在它下面的下一个方法中出现了这个错误。因此,这个错误不仅可能是由于混合使用制表符和空格造成的。 - Prof. Falken
27
我正在使用Sublime Text 3。我有一个Django项目。我使用“View > Indentation > Intent Using Spaces”修复了错误。 - abhimanyuaryan
3
我发现使用IDLE可以更轻松地找到缩进问题。它能清晰地找出大多数编辑器无法发现的缩进错误。 - Dennis Gathagu
2
Sublime 3.2.2:查看 > 缩进 > 将缩进转换为空格 -- 对我有用 - Impermanence
2
您可以通过查看 Markdown 源代码 看到问题所在: 最后三行前面有制表符。但 Stack Overflow 在呈现时会将制表符转换为 4 个空格,因此该问题就消失了。 - wjandrea
显示剩余2条评论
32个回答

853

这个错误可能的原因之一是缩进中可能混有空格和制表符。尝试使用搜索和替换功能,将所有制表符替换为几个空格。

试试这个:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)

2
是的,在最后两行(仅在SO中),我必须花费很多时间来调整内部循环部分。不确定为什么... - cbrulak
4
我的第一行代码是"result = 0"(本应该是1,感谢您的更正),但这一行与其他行不同,我使用了空格而非制表符。真糟糕,我之前不知道Python会有这种区别。 - cbrulak
1
是的,这可能有点棘手。我使用emacs编辑Python,并将其设置为始终在py文件中用空格替换制表符,以便我不会遇到这个问题。Notepad++也可能有类似的选项。 - Kevin Tighe
4
目前我也遇到同样的问题:SublimeText 将空格显示为点,这非常有用。 - Kris
1
在我的情况下,我的代码中某处缩进错误(3个空格而不是4个空格)。 - Stefan Braun
显示剩余3条评论

329

重要提示使用空格是首选方法 - 参见PEP 8 缩进制表符或空格?。(感谢@Siha的贡献。)

对于Sublime Text用户:

设置Sublime Text使用制表符进行缩进: View --> Indentation --> Convert Indentation to Tabs

同时在上述子菜单中取消使用空格缩进选项。 这将立即解决此问题。


2
同样,无论何时使用Python,请确保在您使用的任何IDE/文本编辑器中设置类似的选项。 - psiyum
22
在ATOM中,选择Packages > Whitespace > Convert Spaces to Tabs,这样你就可以避免Python的语法错误问题! - loretoparisi
2
首选的缩进方式是空格 - 请参阅PEP008 IndentationTabs or Spaces?。Sublime也可以设置为这种方式。 - SiHa
17
你说使用空格是首选的方法,但你的回答却要求人们请求Sublime改用制表符!我感到困惑。 - gota
@NunoCalaim 很不幸,那是在我回答问题之后发生的。如果您正在启动一个新项目,请使用首选的空格技术。这就是为什么我进行了加粗编辑,以便任何新手都知道免责声明。 - psiyum
cat -T yourfile.py将有助于更容易地发现这个问题。我在一个pydoc的开头有一个制表符,想知道删除pydoc是否为我消除了这个错误。 - Cameron Kerr

152
为了方便检查制表符/空格问题,你可以采用以下方法:
python -m tabnanny yourfile.py

或者你当然可以正确地设置你的编辑器 :-)


1
我在一个文件中尝试了一下,发现有一些制表符/空格缩进错误,但是在一个错误的制表符文件中却没有任何输出。你有什么想法吗? - Luchux
1
我遇到了一个空格问题,错误提示在第191行,但是多亏了tabnanny,我发现真正的问题不在那一行,而是在上一行。 - richar8086
谢谢!太棒了。Flake8在VS Code中识别出了错误,但它无法确定问题所在——而tabnanny在一微秒内就找到了。 - Steve

50

你确定你在缩进空白处没有混用制表符和空格吗?(那会导致错误。)

注意,建议不要在Python代码中使用制表符。请参阅样式指南。您应该配置Notepad++以将制表符转换为空格。


我有点困惑。上面的答案说要切换文本编辑器选项,使用制表符而不是空格。 - spurra
3
只要你只使用制表符或只使用空格,选择哪种方式实际上并不重要。但是对于Python来说,首选空格,请参阅我提到的链接。 - zdan

29
无论何时遇到这个错误,都是因为我在编辑器中某种程度上混淆了制表符和空格。

22
如果你正在使用Vim,按下Esc键然后输入

gg=G

这将自动缩进所有内容并清除您添加的任何空格。


18
如果你使用Python的IDLE编辑器,你可以按照它在类似错误信息中所建议的方法操作:
1)全选,例如Ctrl + A 2)转到“格式” -> “取消制表符区域”
3)仔细检查你的缩进是否仍然正确,保存并重新运行你的程序。
我正在使用Python 2.5.4版本。

12

使用 Visual Studio Code

如果您正在使用 VS Code,那么可以按照以下简单步骤将所有混合缩进转换为空格或制表符。

  1. 按下 Ctrl + Shift + p

  2. 键入 indent using spaces

  3. 按下 Enter


1
谢谢!简单明了!这对我有用。 - Sopeade Lanlehin

11

对于Spyder用户,请前往源代码 > 修复缩进,以立即解决该问题。


11

这行代码:result = result * i 应该缩进(它是for循环的主体)。

或者 - 你混合使用了空格和制表符。


我不得不在SO中更改编辑方式,很奇怪。请查看我在问题中更新的“编辑”注释。 - cbrulak
好的,我相信我的回答的第二行是正确的 - 你混合使用了空格和制表符(在ASCII中分别为32和8)。 - Abgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接