【问题标题】:IndentationError: unindent does not match any outer indentation levelIndentationError: unindent 不匹配任何外部缩进级别
【发布时间】:2010-10-04 06:59:42
【问题描述】:

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

为什么?

【问题讨论】:

  • 如果你想在计算中包含'n',可能 range(1, n+1) 会更好:-)
  • 我遇到了同样的错误,但我碰巧在代码中向左缩进了一个方法向上,这在 的底部给出了这个错误next 方法。所以这个错误不仅可能来自混合制表符和空格。
  • 我正在使用 Sublime Text 3。我有一个 Django 项目。我使用 View > Indentation > Intent Using Spaces 修复了错误
  • 在 pycharm 中有这个问题,在配置中调整制表符和间距不起作用。问题是我有一个覆盖 pycharm 配置的 ~/.editorconfig 文件。
  • 我发现使用 IDLE 可以更轻松地找到缩进问题。它会清楚地发现大多数编辑不会发现的缩进错误。

标签: python indentation


【解决方案1】:

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

"""comment comment 
comment
"""

它们还需要对齐,请参阅此处同一页面上的other answer

只需几行即可重现:

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

【讨论】:

    【解决方案2】:

    如果你使用colab,那么你可以通过这个命令来避免错误。

    所有 [space] 缩进转换为 [tab] 缩进。然后OK。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            使用 Visual Studio 代码

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

            1. Ctrl + Shift + p

            2. 输入indent using spaces

            3. Enter

            【讨论】:

            • 谢谢!短而甜!这对我有用。
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                例如:

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

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                  • 带着问题来找一个好心人已经写出了解决方案真是太可爱了!
                  【解决方案11】:

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

                  1) 全选,例如Ctrl + A

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

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

                  我使用的是 Python 2.5.4

                  【讨论】:

                    【解决方案12】:

                    SPYDER 用户:我正在使用 spyder 3.3.2 和 python 3.7.1,我解决了这个问题,设置缩进以使用制表符,通过以下步骤,点击:

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

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

                    由于某种原因,没有这个设置,我有时会得到 ghost IndentationError。

                    【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                        【解决方案14】:

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

                        【讨论】:

                          【解决方案15】:

                          不管怎样,我的文档字符串缩进太多,这也会引发同样的错误

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

                          IndentationError: unindent does not match any outer indentation level

                          【讨论】:

                          • 这解决了我的问题
                          【解决方案16】:

                          首先,提醒您有一个逻辑错误,您最好保持 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 的经验,那么您可以理解为什么我们必须留下一行。

                          【讨论】:

                            【解决方案17】:

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

                            【讨论】:

                              【解决方案18】:

                              我定义了一个函数,但它除了它的函数 cmets 之外没有任何内容...

                              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】:

                              由于我意识到没有特定于 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!")
                              

                              【讨论】:

                                【解决方案20】:

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

                                试试这个:

                                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)
                                

                                【讨论】:

                                • 是的,我必须在最后两行的内部循环部分上留出空间(仅在 SO 中)。不知道为什么...
                                • 我的第一行,“result = 0”(应该是 1,感谢纠正)被隔开,而其余的被标签,该死,不知道 python 是这样的
                                • 是的,这可能很棘手。我使用 emacs 来编辑 python,并且我将它设置为始终用 py 文件中的空格替换制表符,所以我没有这个问题。 Notepad++ 可能也有这样的选项。
                                • atm 遇到同样的问题 :)。 SublimeText 将空格显示为点,非常有用。
                                • 我想知道为什么开发人员不尝试修复此错误。当配置已经提到 tabs=4 个空格时,它是没用的。所以,两者都应该随时工作。现在是 2018 年
                                【解决方案21】:

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

                                Sublime Text 用户:

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

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

                                【讨论】:

                                • 无论何时使用 Python,请确保在您使用的任何 IDE/文本编辑器中设置类似的选项
                                • 同样在 ATOM、包 > 空白 > 将空格转换为制表符,您将避免 Python 的语法错误头痛!
                                • 空格是首选方法 - 请参阅 PEP008 IndentationTabs or Spaces?。 Sublime 也可以通过这种方式进行设置。
                                • 您说空格是首选方法,但您的回答要求人们要求 sublime 使用制表符!我很困惑
                                • @NunoCalaim 不幸的是,这发生在我回答问题之后。如果您正在开始一个新项目,请使用首选的空格技术。这就是为什么我用粗体进行了编辑,以便任何新人都知道免责声明。
                                【解决方案22】:

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

                                1. 在 sublime 中打开你的文件
                                2. 右键单击空白处
                                3. 选择蟒蛇
                                4. 点击自动格式化
                                5. 完成或按 CTRL+ALT+R。

                                【讨论】:

                                  【解决方案23】:

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

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

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

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

                                  【讨论】:

                                    【解决方案24】:

                                    对于 Atom 用户,Packages -&gt;whitspace -&gt; remove trailing whitespaces 这对我有用

                                    【讨论】:

                                      【解决方案25】:

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

                                      gg=G

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

                                      【讨论】:

                                        【解决方案26】:

                                        开启Atom

                                        Packages > Whitespace > Convert Spaces to Tabs
                                        

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

                                        python -m tabnanny yourFile.py
                                        

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

                                        【讨论】:

                                          【解决方案27】:

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

                                          1) 全选,例如Ctrl + A

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

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

                                          我正在使用 Python 3.4.2

                                          【讨论】:

                                            【解决方案28】:

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

                                            【讨论】:

                                              【解决方案29】:

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

                                              【讨论】:

                                                【解决方案30】:

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

                                                【讨论】:

                                                  猜你喜欢
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  相关资源
                                                  最近更新 更多