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

时间:2009-01-29 16:34:47

标签: python indentation

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

为什么?

34 个答案:

答案 0 :(得分:546)

其他海报可能是正确的......可能会有与您的标签混合的空格。尝试进行搜索&用一些空格替换所有标签。

试试这个:

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)

答案 1 :(得分:220)

重要 空格是首选方法 - 请参阅PEP008 IndentationTabs or Spaces?。 (感谢@Siha。)

对于Sublime Text用户:

设置Sublime Text以使用标签进行缩进: View - > Indentation - > Convert Indentation to Tabs

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

答案 2 :(得分:123)

要轻松检查标签/空格的问题,您可以实际执行此操作:

python -m tabnanny yourfile.py

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

答案 3 :(得分:35)

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

注意,建议您不要在Python代码中使用选项卡。请参阅style guide。您应该配置Notepad ++以为选项卡插入空格。

答案 4 :(得分:16)

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

答案 5 :(得分:9)

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

1)选择全部,例如Ctrl + A

2)转到格式 - >解除区域

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

我正在使用Python 2.5.4

答案 6 :(得分:8)

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

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

答案 7 :(得分:7)

如果您使用的是Vim,请点击“转义”,然后输入

GG = G

这个自动缩进所有内容,并清除你抛出的任何空格。

答案 8 :(得分:4)

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

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

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

答案 9 :(得分:4)

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

答案 10 :(得分:4)

Atom

转到

Packages > Whitespace > Convert Spaces to Tabs

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

python -m tabnanny yourFile.py

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

答案 11 :(得分:2)

for Atom Users,Packages ->whitspace -> remove trailing whitespaces 这对我有用

答案 12 :(得分:2)

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

<块引用>

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

答案 13 :(得分:2)

使用Visual Studio代码

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

  1. Ctrl + Shift + p

  2. 类型indent using spaces

  3. Enter

答案 14 :(得分:2)

对于Spyder用户,请转到 来源>修复缩进 立即解决问题

答案 15 :(得分:1)

昨天我遇到了同样的问题,这是缩进错误,是使用了崇高的文本编辑器。花了我几个小时试图解决它,最后我最终将代码复制到VI文本编辑器,它只是工作正常。 ps python太空白敏感,请确保不要混合空格和制表符。

答案 16 :(得分:1)

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

  1. 未接受的缩进
  2. 外部缩进级别

    转到----&gt;搜索标签----&gt;点按替换 ----&gt;按下扩展下面的单选按钮---&gt;现在将\ t替换为四个空格

    转到----&gt;搜索标签----&gt;点按替换 ----&gt;按下扩展下面的单选按钮---&gt;现在将

答案 17 :(得分: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!")

答案 18 :(得分: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

在任何情况下,请确保使其显而易见 为什么是空函数-对于您自己或将使用代码的同行

答案 19 :(得分:1)

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

答案 20 :(得分: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的经验,那么您可以理解为什么我们必须离开一行。

答案 21 :(得分:1)

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

答案 22 :(得分:0)

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

1)选择全部,例如Ctrl + A

2)转到代码 - &gt;解除区域

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

我正在使用Python 3.4.2

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

或者, 试着写下这个:

#!/usr/bin/python -tt

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

答案 25 :(得分:0)

我在Flask项目中使用Sublime Text 3。我使用“视图”>“缩进”>“制表符宽度:4”(未选择“使用空格缩进”)解决了该错误

答案 26 :(得分:0)

例如:

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

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

答案 27 :(得分:0)

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

pydev @ Eclipse

答案 28 :(得分:0)

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

  • 工具。
  • 首选项。
  • 编辑器。
  • 高级设置。
  • 缩进字符->制表符。

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

由于某种原因,没有此设置,有时会出现 ghost IndentationError。

答案 29 :(得分:0)

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

答案 30 :(得分:0)

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

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

IndentationError: unindent does not match any outer indentation level

答案 31 :(得分:0)

如果你使用Sublime文本进行python开发,你可以使用Anaconda包来避免错误。安装Anaconda之后,

  
      
  1. 以崇高的方式打开您的文件
  2.   
  3. 右键单击空白区域
  4.   
  5. 选择anaconda
  6.   
  7. 点击autoformat
  8.   
  9. 完成或按CTRL + ALT + R。
  10.   

答案 32 :(得分:-1)

尝试用另一个编辑器打开文件,检查行的组织方式是否有任何问题。

答案 33 :(得分:-4)

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