ChatGPT解决这个技术问题 Extra ChatGPT

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

当我编译下面的 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) 可能会更好:-)
我有同样的错误,但我碰巧在代码中稍微向左缩进了一个方法,这在它之后的下一个方法的底部给出了这个错误。因此,此错误不仅可能来自混合制表符和空格。
我正在使用 Sublime Text 3。我有一个 Django 项目。我使用 View > Indentation > Intent Using Spaces 修复了错误
在 pycharm 中遇到此问题,在配置中调整选项卡和间距不起作用。问题是我有一个覆盖 pycharm 配置的 ~/.editorconfig 文件。
我发现使用 IDLE 可以更容易地找到缩进问题。它会清楚地发现大多数编辑不会发现的缩进错误。

i
isherwood

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

尝试这个:

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 年
w
wjandrea

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

对于 Sublime Text 用户:

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

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


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

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

python -m tabnanny yourfile.py

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


我在一个带有一些制表符/空格缩进错误的文件中尝试了此操作,但由于制表符文件不正确,根本没有输出。任何想法?
我遇到了空格问题,错误说它在第 191 行,但感谢 tabnanny,我发现真正的问题不在该行,而是在上面的行。
谢谢!多么棒的小费。 VS Code 中的 flake8 发现了错误,但它无法确定问题出在哪里——tabnanny 在微秒内完成了。
P
Peter Mortensen

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

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


我很困惑。上面的答案指出将文本编辑器选项切换为使用制表符而不是空格。
@BananaCode 只要您仅使用制表符或仅使用空格,从技术上讲,您选择哪个并不重要。虽然对于 python,空格是首选,请参阅我提到的链接。
D
Dana

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


c
cbartondock

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

gg=G

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


T
Tshilidzi Mudau

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

1) 全选,例如 Ctrl + A

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

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

我正在使用 Python 2.5.4


A
Abgan

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

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


我不得不改变 SO 中的编辑,奇怪。在问题中查看我更新的“编辑”注释
好的,所以我相信我的答案的第二行是正确的——你有混合的空格和制表符(ASCII 中分别为 32 和 8)
A
Abdulbasith

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


带着问题来找一个好心人已经写出了解决方案真是太可爱了!
l
loretoparisi

Atom

Packages > Whitespace > Convert Spaces to Tabs

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

python -m tabnanny yourFile.py

或者

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

D
Devil

使用 Visual Studio 代码

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

按 Ctrl + Shift + p 使用空格键入缩进 按 Enter


谢谢!短而甜!这对我有用。
J
Jackie Lee

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


M
Matt Kahl

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

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

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


佚名

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

无例外缩进外部缩进级别转到---->搜索选项卡---->点击替换---->点击下面的单选按钮扩展--->现在用四个空格替换\t转到---- > 搜索选项卡 ----> 点击替换 ----> 点击下方扩展的单选按钮 ---> 现在将 \n 替换为空


C
Cur123

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


p
plfrick

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

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

IndentationError: unindent does not match any outer indentation level


这解决了我的问题
D
Dharman

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

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


W
WangSung

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

< Ctrl-A > < Tab > < Shift-Tab >

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


完美运行!!多谢。
A
Ali

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

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

N
NelsonGon

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

b
bmc

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


E
Eragon

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

或者,尝试这样写:

#!/usr/bin/python -tt

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


u
user3731311

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


A
Aha

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


C
Cedric

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

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

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


pass statement 在那里可能很有用:)
F
Faisal Ahmed Farooq

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


A
Ayush Aryan

例如:

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

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


B
Bartleby

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


R
Rui Martins

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

https://i.stack.imgur.com/Ve5TD.png


I
Imtiaz Pabel

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

1) 全选,例如 Ctrl + A

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

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

我正在使用 Python 3.4.2


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅

相似问题