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


584

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

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


import sys

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

为什么?


7
如果想在计算中包括“ n”,可能范围(1,n + 1)会更好:-)
Abgan

7
我有同样的错误,但我碰巧缩进的方法一路代码稍微向左,这在底部给这个错误在下之后方法。因此,不仅混合制表符和空格可能会发生此错误。
Falken教授的合同

14
我正在使用Sublime Text3。我有一个Django项目。我使用View > Indentation > Intent Using Spaces
AbhimanyuAryan

如果在pycharm中出现此问题,则无法在配置中调整制表符和间距。问题是我有一个〜/ .editorconfig文件,该文件覆盖了pycharm配置。
肯·迈尔斯

我发现使用IDLE可以更轻松地查找缩进问题。它将清楚地找到大多数编辑器不会发现的缩进错误。
丹尼斯·加萨古

Answers:


668

其他海报可能是正确的...选项卡中可能混有空格。尝试执行搜索和替换操作,以将所有标签替换为几个空格。

尝试这个:

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

3
我的第一行“ result = 0”(应该校正为1,应为1)被隔开,其余的选项
卡住了

1
是的,这可能很棘手。我使用emacs编辑python,我将其设置为始终用py文件中的空格替换制表符,因此我没有这个问题。Notepad ++可能也有这样的选项。
凯文·提格(Jevin Tighe),2009年

3
得到了同样的问题atm :)。SublimeText将空格显示为点,它非常有用。
克里斯(Kris)

因此,请稍等,您可以缩进空格或制表符。您只需要坦率些?刘海头
大卫

265

重要说明空格是首选方法 -请参阅PEP008 缩进制表符或空格?。(感谢@Siha。)

对于Sublime Text用户:

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

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


1
此外,每当使用Python,请确保您设置哪个IDE /文本编辑器使用一个类似的选项
activatedgeek

20
同样在ATOM上,选择Packages> Whitespace> Convert Spaces to Tabs,您将避免Python的语法错误头痛!
loretoparisi 2015年

1
空格是首选方法-请参阅PEP008 缩进制表符或空格?。崇高也可以设置为以这种方式进行。
2013年

13
您说空格是首选的方法,但是您的答案要求人们要求崇高的方式使用制表符!我很困惑
哥达

@NunoCalaim不幸的是,那是在我回答问题之后发生的。如果您要开始一个新项目,请使用首选的空格技术。这就是为什么我以粗体进行编辑,以便所有新手都知道免责声明的原因。
activatedgeek

137

要轻松检查制表符/空格的问题,您可以执行以下操作:

python -m tabnanny yourfile.py

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


1
我在带有一些制表符/空格缩进错误的文件中尝试了此操作,但是在制表符文件不正确的情况下根本没有输出。任何的想法?
卢克斯(Luchux)2012年

1
我的空格有问题,错误说它在191行,但是由于有了tabnanny,我发现真正的问题不在那行,而是在上一行。
richar8086

谢谢!太棒了。错误是由VS Code中的flake8识别的,但无法识别问题出在哪儿 -Tabnanny在一微秒内就做了。
史蒂夫,

39

您确定不在缩进空格中混用制表符和空格吗?(这将导致该错误。)

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


我糊涂了。上面的答案指出要切换文本编辑器选项以使用制表符而不是空格。
spurra

3
@BananaCode只要您仅使用制表符或仅空格,从技术上来说,选择哪种都无所谓。尽管对于python来说,空格是首选,请参阅我所引用的链接。
zdan 2015年

21

每当遇到此错误时,都是因为我以某种方式混淆了编辑器中的制表符和空格。


13

如果使用Python的IDLE编辑器,则可以按照类似的错误消息之一进行操作:

1)全选,例如Ctrl+A

2)转到格式->取消制表区域

3)仔细检查您的缩进是否仍然正确,保存并重新运行您的程序。

我正在使用Python 2.5.4


9

如果您使用的是Vim,请按Escape键,然后输入

gg = G

这会自动缩进所有内容,并清除您抛出的所有空格。


8

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

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


我不得不更改SO中的编辑,很奇怪。请参阅问题中我更新的“编辑”笔记
cbrulak

好吧,所以我相信我的答案的第二行是正确的-您混合使用了空格和制表符(ASCII中分别为32和8)
Abgan 2009年

5

原子上

Packages > Whitespace > Convert Spaces to Tabs

然后再次检查您的文件缩进:

python -m tabnanny yourFile.py

要么

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

4

看起来是一个缩进问题。你不必匹配在Python大括号,但你必须匹配缩进层次。

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

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


4

如果使用notepad ++,请使用扩展搜索模式“替换”以找到\ t并用四个空格替换。


2

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


2

只是一个补充。我在Notepad ++中的两个缩进都有类似的问题。

  1. 无例外的缩进
  2. 外压痕等级

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

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


2

我使用的是Jupyter笔记本,尝试了几乎所有上述解决方案(以适应我的情况)为无效。然后,我一行一行地删除了每一行的所有空格,并用tab代替了。那解决了问题。



1

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

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")

1

昨天我遇到了同样的问题,这是缩进错误,正在使用崇高的文本编辑器。花了我几个小时的时间来修复它,最后我最终将代码复制到VI文本编辑器中,并且运行良好。ps python对空格太敏感,请确保不要混合使用空格和制表符。


1

因为我意识到没有特定的答案spyder,所以我将添加一个答案:基本上,仔细查看您的if声明并确保全部ifelifelse具有相同的间距,即它们在开始时位于同一行,如下所示:

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

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

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

大喊:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

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

-

多种解决方案:

1:仅将功能注释掉

2:添加功能注释

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

3:添加不执行任何操作的行

def foo(bar):
    0

在任何情况下,请务必使其明显的 ,为什么它是一个空的功能-为自己,或您的同事将使用代码


通声明可能是有用的有:)
KevinG

1

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

其次,您可以这样编写:

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的经验,那么您可以理解为什么我们必须行。


1

对于它的价值,我的文档字符串缩进太多,这也引发了相同的错误

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

IndentationError: unindent does not match any outer indentation level


这解决了我的问题
布尔杜普尔

0

这是因为制表符和空格混在一起。您可以删除所有空格,然后将其替换为制表符。

或者,尝试编写以下代码:

#!/usr/bin/python -tt

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



0

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

1)全选,例如Ctrl + A

2)转到代码->取消制表区域

3)仔细检查您的缩进是否仍然正确,保存并重新运行您的程序。

我正在使用Python 3.4.2


0

如果您将Sublime文本用于python开发,则可以使用Anaconda软件包来避免该错误。安装Anaconda后,

  1. 崇高地打开文件
  2. 右键单击开放空间
  3. 选择水蟒
  4. 点击自动格式化
  5. 完成或按CTRL + ALT + R。

0

在具有python插件的intellij中,按Ctrl + Shift + Alt重新格式化文档可解决缩进/制表符/空格问题


0

对于SPYDER用户:我将spyder 3.3.2与python 3.7.1结合使用,并解决了此问题,将缩进设置为使用选项卡,并通过以下步骤单击:

  • 工具。
  • 偏好。
  • 编辑。
  • 高级设置。
  • 缩进字符->制表符。

然后,使用Tab键重置“ unidented”行。

由于某种原因,如果没有此设置,有时会出现幽灵 IndentationError。


0

例如:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

在这段代码中,我也遇到了同样的情况。只需删除第2行和第3行的先前缩进空格,然后使用tab或空格即可。切勿同时使用两者。在用python编写代码时,给出适当的缩进。对于Spyder,请转至源>修复缩进。VC代码和崇高文本或任何其他编辑器也是如此。修复缩进。


-6

发生这种情况的主要原因是编辑器。尝试将选项卡更改为spaces(4)。最佳的Python友好IDE或编辑器是pycharm,sublime,vim(对于Linux)。
即使我也遇到过同样的问题,后来我发现还有一个编码问题。我建议您也更改您的编辑器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.