关于python:IndentationError:unindent与任何外部缩进级别都不匹配

IndentationError: unindent does not match any outer indentation level

当我编译下面的python代码时,我得到

IndentationError: unindent does not match any outer indentation level

1
2
3
4
5
6
7
8
import sys

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

为什么?


其他的海报可能是正确的……你的标签中可能有混合的空间。尝试执行搜索&replace,将所有选项卡替换为几个空格。

试试这个:

1
2
3
4
5
6
7
8
9
10
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)


重要:空格是首选方法-请参阅PEP008缩进和制表符或空格?(多亏了@siha。)

对于Sublime Text用户:

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

取消选中上述同一子菜单中的Indent Using Spaces选项。这将立即解决此问题。


要轻松检查选项卡/空格的问题,实际上可以执行以下操作:

1
python -m tabnanny yourfile.py

或者你也可以正确地设置你的编辑器——当然。


您确定在缩进空白处没有混合制表符和空格吗?(这将导致该错误。)

注意,建议不要在Python代码中使用制表符。请参见样式指南。您应该配置notepad++为选项卡插入空格。


每当我遇到这个错误,都是因为我在编辑器中混淆了制表符和空格。


如果使用python的空闲编辑器,可以按照类似错误消息中的建议进行操作:

1)全选,如ctrl+a

2)转到"格式"->"不区分区域"

3)再次检查缩进是否正确,保存并重新运行程序。

我使用的是python 2.5.4


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

或者-您有混合空格和制表符


如果你使用VIM,点击Escape然后输入

gg=g

这将自动缩进所有内容,并清除您已放入的所有空格。


看起来是一个压痕问题。您不必匹配Python中的花括号,但必须匹配缩进级别。

防止空格/制表符问题的最佳方法是在文本编辑器中显示不可见字符。这将为您提供一种快速的方法来防止和/或解决与缩进相关的错误。

此外,注入复制粘贴代码也是此类问题的常见来源。


原子论

1
Packages > Whitespace > Convert Spaces to Tabs

然后再次检查文件缩进:

1
python -m tabnanny yourfile.py

1
2
>python
>>> help("yourFile.py")

如果使用记事本++,请使用扩展搜索模式进行"替换"以查找 并替换为四个空格。


对于Atom用户,Packages ->whitspace -> remove trailing whitespaces这对我有用


我昨天也出了同样的问题,那是缩进错误,使用的是高级文本编辑器。我花了好几个小时试图修复它,最后我把代码复制到了vi文本编辑器中,它工作得很好。ps python对空格太敏感,请确保不要混合空格和制表符。


只是一个补充。我在记事本+中的两个缩进也有类似的问题。

  • 无例外压痕
  • 外压痕水平

    转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在用四个空格替换

    转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在替换为空


  • 由于我知道没有针对spyder的答案,我将添加一个:基本上,仔细查看您的if声明,确保所有ifelifelse具有相同的间距,即它们在开始时位于同一行,就像这样:

    1
    2
    3
    4
    5
    6
    7
    def your_choice(answer):
        if answer>5:
            print("You're overaged")
        elif answer<=5 and answer>1:
                print("Welcome to the toddler's club!")
        else:
                print("No worries mate!")

    我定义了一个函数,但除了函数注释之外,它没有任何内容…

    1
    2
    3
    4
    def foo(bar):
        # Some awesome temporary comment.
        # But there is actually nothing in the function!
        # D'Oh!

    它喊道:

    1
    2
    3
    4
      File"foobar.py", line 69

                                    ^
    IndentationError: expected an indented block

    (注意,^标记指向的行为空)

    ——

    多种解决方案:

    1:只需对函数进行注释

    2:添加函数注释

    1
    2
    def foo(bar):
        '' Some awesome comment. This comment could be just one space.''

    3:添加不起作用的行

    1
    2
    def foo(bar):
        0

    在任何情况下,确保它是一个空函数的原因是显而易见的——对于您自己,或者对于将使用您的代码的同事来说。


    我用的是Jupyter笔记本,几乎所有上述的解决方案(适应我的场景)都没用。然后,我一行一行地删除了每行的所有空格,并替换为制表符。解决了这个问题。


    首先,为了提醒您有一个逻辑错误,您最好保持result=1,否则即使循环运行之后,输出结果也将为result=0。

    其次,你可以这样写:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import sys

    def Factorial(n): # Return factorial
      result = 0
      for i in range (1,n):
         result = result * i

      print"factorial is",result
      return result

    留下一行将告诉python shell for语句已经结束。如果您有使用python shell的经验,那么您可以理解为什么我们必须留下一行代码。


    就其价值而言,我的docstring缩进太多,这也会引发相同的错误。

    1
    2
    3
    class junk:
        """docstring is indented too much"""
        def fun(): return

    IndentationError: unindent does not match any outer indentation level


    如果您在python开发中使用sublime文本,可以使用包anaconda来避免错误。

  • open your file in sublime
  • right click on the open spaces
  • choose anaconda
  • click on autoformat
  • DONE Or Press CTRL+ALT+R.

  • 在我的例子中,问题在于Eclipse上Pydev的配置

    pydev @ Eclipse


    这是因为标签和空格混合在一起。您可以删除所有空格并用制表符替换它们。

    或者,试着写这个:

    1
    #!/usr/bin/python -tt

    在代码的开头。此行解决了制表符和空格之间的任何差异。


    这可能是因为上面的函数缩进方式不同。即

    1
    2
    3
    4
    5
    class a:
        def blah:
          print("Hello world")
        def blah1:
          print("Hello world")


    如果使用Komodo编辑器,则可以按照类似错误消息中的建议进行操作:

    1)全选,如ctrl+a

    2)转到"代码"->"无双区"

    3)再次检查缩进是否正确,保存并重新运行程序。

    我使用的是python 3.4.2


    这主要是由于编辑器的缘故。请尝试将制表符更改为空格(4)。最适合Python的IDE或编辑器是pycharm、sublime、vim for linux。
    即使我也遇到过同样的问题,后来我发现有一个编码问题。我建议你也改变你的编辑。