729

当我编译下面的 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

为什么?

4

37 回答 37

811

其他海报可能是正确的……您的标签中可能混有空格。尝试进行搜索和替换以用几个空格替换所有选项卡。

试试这个:

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)
于 2009-01-29T16:37:18.510 回答
319

重要提示空格是首选方法- 请参阅 PEP 8缩进制表符或空格?. (为此感谢@Siha。)

对于Sublime Text用户:

Sublime Text设置为使用制表符进行缩进: 查看-->缩进-->将缩进转换为制表符

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

于 2014-05-08T11:44:49.773 回答
150

要轻松检查制表符/空格的问题,您实际上可以这样做:

python -m tabnanny yourfile.py

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

于 2009-02-04T21:50:28.420 回答
48

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

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

于 2009-01-29T16:41:15.240 回答
28

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

于 2009-01-29T16:45:19.430 回答
18

如果您使用的是 Vim,请点击 escape,然后键入

gg=G

此自动缩进所有内容并将清除您输入的所有空格。

于 2015-05-07T09:43:20.837 回答
17

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

1) 全选,例如Ctrl+A

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

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

我正在使用 Python 2.5.4

于 2013-06-13T15:26:00.760 回答
11

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

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

于 2009-01-29T16:38:04.560 回答
10

原子上

Packages > Whitespace > Convert Spaces to Tabs

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

python -m tabnanny yourFile.py

或者

>python
>>> help("yourFile.py")
于 2015-03-11T14:27:23.440 回答
10

对于 Spyder 用户,请转到 Source > Fix Indentation 以立即解决问题

于 2020-01-05T16:56:55.533 回答
8

如果您使用记事本++,请使用扩展搜索模式执行“替换”以查找 \t 并替换为四个空格。

于 2014-03-20T17:23:01.500 回答
8

使用 Visual Studio 代码

如果您使用的是 vs code than,它将使用以下简单步骤将所有混合缩进转换为空格或制表符。

  1. Ctrl + Shift + p

  2. 类型indent using spaces

  3. Enter

于 2020-07-24T08:01:24.113 回答
7

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

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

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

于 2012-07-31T20:27:51.850 回答
5

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

  1. 无例外的缩进
  2. 外部缩进级别

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

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

于 2015-11-12T21:42:44.137 回答
5

我正在使用 Jupyter notebook 并尝试了几乎所有上述解决方案(适应我的场景)都没有用。然后我逐行删除每一行的所有空格并替换为制表符。这解决了这个问题。

于 2018-12-15T04:48:05.587 回答
5

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

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

IndentationError: unindent does not match any outer indentation level

于 2019-03-05T23:00:45.870 回答
5

我在 Ubuntu 操作系统中使用Sublime 文本。要解决此问题,请访问

查看 -> 缩进 -> 将缩进转换为制表符

于 2021-03-03T10:28:51.550 回答
2

这可能是因为它上面的函数没有以相同的方式缩进。IE

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")
于 2014-02-14T02:52:13.967 回答
2

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

于 2015-07-28T12:41:15.563 回答
2

由于我意识到没有特定于 的答案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!")
于 2018-12-07T13:42:26.443 回答
2

我正在使用带有 Flask 项目的 Sublime Text 3。我使用 View > Indentation > Tab Width: 4 after unselected Indent Using Spaces 修复了错误

于 2020-06-30T15:52:40.497 回答
2

如果您使用 colab,那么您可以通过此命令避免错误。

  1. < Ctrl-A >
  2. <标签>
  3. < Shift-Tab >

都是 [tab] 缩进转换为 [space] 缩进。然后确定。

于 2021-11-25T03:40:10.697 回答
1

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

或者,尝试这样写:

#!/usr/bin/python -tt

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

于 2014-03-05T13:43:15.200 回答
1

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

于 2014-06-26T15:57:37.433 回答
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

在任何情况下,请务必明确 说明为什么它是一个空函数 - 为您自己或将使用您的代码的同行

于 2018-12-10T14:07:07.620 回答
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 的经验,那么您可以理解为什么我们必须留下一行。

于 2018-12-25T11:49:39.063 回答
1

即使我的代码中没有任何选项卡,我也会收到此错误,原因是我的代码中某处有一个多余的右括号。我应该早点弄清楚这一点,因为它在一些等号之前和之后弄乱了空格......如果即使在Reformat codeIDE 中运行(或手动运行 autopep8)后发现任何问题,请确保所有括号匹配,从后面开始第一个等号之前/之后的奇怪空格。

于 2020-07-24T07:52:41.453 回答
0

就我而言,问题是 Eclipse 上的 pydev 配置

pydev@Eclipse

于 2014-03-08T11:13:10.263 回答
0

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

1) 全选,例如 Ctrl + A

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

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

我正在使用 Python 3.4.2

于 2014-12-02T19:47:04.327 回答
0

如果你使用 Sublime text 进行 python 开发,可以通过使用 Anaconda 包来避免该错误。安装 Anaconda 后,

  1. 用崇高的方式打开你的文件
  2. 右键单击开放空间
  3. 选择蟒蛇
  4. 点击自动格式化
  5. 完成或按 CTRL+ALT+R。
于 2015-01-28T07:18:27.623 回答
0

在带有 python 插件的 intellij 中,Ctrl + Shift + Alt 重新格式化文档修复了缩进/制表符/空格问题

于 2019-07-29T17:28:19.710 回答
0

对于SPYDER用户:我将 spyder 3.3.2 与 python 3.7.1 一起使用,我解决了这个问题,将缩进设置为使用制表符,通过以下步骤,单击:

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

然后我使用制表键重置“未识别”行。

出于某种原因,如果没有这个设置,我有时会得到幽灵IndentationError。

于 2019-08-13T08:13:59.637 回答
0

例如:

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

在这段代码中,我也发生了同样的情况。只需删除第 2 行和第 3 行之前的缩进空格,然后使用制表符或空格。永远不要同时使用。在 python 中编写代码时给予适当的缩进。对于 Spyder 转到源 > 修复缩进。VC 代码和 sublime text 或任何其他编辑器也是如此。修复缩进。

于 2020-04-11T06:48:39.947 回答
0

尝试使用其他编辑器打开文件,并检查行的组织方式是否有任何问题。

于 2021-06-20T03:18:58.210 回答
0

我今天遇到了这个问题,没有看到我犯的错误,所以我想我会添加它——也许可以为其他人节省几个小时:)

我在函数中使用回车,在这种情况下,空白行没有正确缩进。这导致 Python 抛出此错误并退出。

于 2021-11-17T15:20:22.107 回答
-1

由于另一件事,我遇到了同样的错误,这与制表符与空格无关。我的第一个if缩进略多于else:更远的缩进。如果它只有一两个空格,您可能会在一段长代码块后对其进行监督。与文档字符串相同:

"""comment comment 
comment
"""

它们还需要对齐,请参阅此处同一页面上的其他答案。

用几行即可重现:

if a==1:
    print('test')
 else:
    print('test2')

抛出:

  File "<ipython-input-127-52bbac35ad7d>", line 3
    else:
         ^
IndentationError: unindent does not match any outer indentation level
于 2021-10-01T14:19:37.510 回答
-5

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

于 2018-01-29T03:53:33.427 回答