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。)
对于
将
取消选中上述同一子菜单中的
要轻松检查选项卡/空格的问题,实际上可以执行以下操作:
1 | python -m tabnanny yourfile.py |
或者你也可以正确地设置你的编辑器——当然。
您确定在缩进空白处没有混合制表符和空格吗?(这将导致该错误。)
注意,建议不要在Python代码中使用制表符。请参见样式指南。您应该配置notepad++为选项卡插入空格。
每当我遇到这个错误,都是因为我在编辑器中混淆了制表符和空格。
如果使用python的空闲编辑器,可以按照类似错误消息中的建议进行操作:
1)全选,如ctrl+a
2)转到"格式"->"不区分区域"
3)再次检查缩进是否正确,保存并重新运行程序。
我使用的是python 2.5.4
行:
或者-您有混合空格和制表符
如果你使用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用户,
我昨天也出了同样的问题,那是缩进错误,使用的是高级文本编辑器。我花了好几个小时试图修复它,最后我把代码复制到了vi文本编辑器中,它工作得很好。ps python对空格太敏感,请确保不要混合空格和制表符。
只是一个补充。我在记事本+中的两个缩进也有类似的问题。
外压痕水平
转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在用四个空格替换
转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在替换为空
由于我知道没有针对
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 |
如果您在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的配置
这是因为标签和空格混合在一起。您可以删除所有空格并用制表符替换它们。
或者,试着写这个:
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。
即使我也遇到过同样的问题,后来我发现有一个编码问题。我建议你也改变你的编辑。