与python中的“意外缩进”怎么办?


117

如何纠正python中的“意外缩进”错误?


4
产生错误的代码片段将帮助我们更好地理解您的问题。请编辑您的问题以包含一些代码。
RBerteig

7
在我看来,这听起来像是一个空白问题,因此代码示例将毫无用处。
詹姆斯·麦克马洪

含糊的问题,没有选择答案。
rafael.js 2012年

“如何纠正错误……”?通过确定发生错误的位置并解决错误原因。在这种情况下,通过使该特定行的缩进看起来像Python期望的那样
twalberg 2014年

Answers:


132

Python在行的开头使用空格来确定代码块的开始和结束时间。您可以获得的错误是:

意外缩进。这行代码的开头比以前的空格多,但前面的不是子块的开头(例如if / while / for语句)。块中的所有代码行必须以完全相同的空格字符串开头。例如:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

当以交互方式运行python时,这一点尤其常见:请确保不要在命令前放置任何多余的空格。(在复制粘贴示例代码时非常烦人!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent与任何外部缩进级别都不匹配。这行代码的开头空格比以前的空格少,但是同样,它与它可能包含的任何其他块也不匹配。Python无法决定其去向。例如,在下面,最终的打印是否应该包含在if子句中?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

预期缩进的块。这行代码的开头与前面的空格数量相同,但是最后一行应开始一个块(例如,if / while / for语句,函数定义)。

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

如果您想要一个不执行任何操作的函数,请使用“ no-op”命令传递

>>> def foo():
...     pass

允许混合使用制表符和空格(至少在我的Python版本中),但是Python假定制表符的长度为8个字符,可能与您的编辑器不匹配。只需对标签说“不”即可。大多数编辑器允许将它们自动替换为空格。

避免这些问题的最佳方法是在缩进子块时始终使用一致数量的空格,并且理想情况下使用可以为您解决问题的良好IDE。这也将使您的代码更具可读性。


7
很好的解释。除此之外,当他在NotePad ++中将空格与“ tab”和“ space bar”混合使用,并将“ tab”替换为“ spaces”并修复时,我还花了缩进意外错误。
何塞·罗萨斯·萨恩斯

2
@JoséRosasSáenz您的评论为我省了很多麻烦
2013年

另一个原因是缺少子句的except一部分try。代码看起来正确(因为未缩进的行本应位于try块的外部),但是Python将其报告为“意外缩进”错误。这是通过将固定except,可能使用pass(如这里
dumbledad

@dumbledad您在哪个版本的python上看到它?当我尝试使用我的(2.7.15和3.6.8两者)时,出现SyntaxError
Alice Purcell,

从网站复制/粘贴代码时遇到此错误。定位看起来不错,但在QGIS(3.10)运行代码之前,我需要删除空格并重新使用空格。
benj

23

在Python中,间距非常重要,这给出了代码块的结构。当您弄乱代码结构时会发生此错误,例如:

def test_function() :
   if 5 > 3 :
   print "hello"

您的文件中可能还会包含选项卡和空格。

我建议您使用python语法感知编辑器,例如PyScripterNetbeans


1
是的,绝对可以使用支持python的编辑器!我有一个问题,在默认设置下用记事本++编辑时,空格错误
Dave Archer 2009年

2
混合制表符和空格会引发“ SyntaxError:缩进中制表符和空格的不一致使用”
SilentGhost 2009年

提醒您,Python Netbeans插件目前无法将制表符转换为现有代码中的空格。但是,它将在您编写新代码时执行。
詹姆斯·麦克马洪

PyCharm可以始终如一地进行转换。它还将突出显示“故障”处的行。我用引号是因为这不是1960年代,而且我不敢相信像Python这样的奇妙语言仍然存在这种令人费解的,浪费时间的缺陷。
梯队2012年

在编写代码的过程中,我无意间切换了编辑器,这使我在新代码中缩进。这种变化看起来并不明显,但是解释器不会运行我的代码。这篇文章帮助我找到了问题。
Lucien Stals,2015年

21

使用-tt选项运行您的代码,以查明您是否不一致地使用了制表符和空格


16

在使用的任何编辑器中打开可见的空白,并打开带空格的替换选项卡。

虽然可以将选项卡与Python混合使用,但通常将选项卡和空格混合会导致您遇到错误。建议使用4个空格替换制表符,这是编写Python代码的推荐方法。


1
您具体如何做?我正在使用Sublime。
chibole

8

通过使用正确的缩进。Python具有空格意识,因此您需要按照其块的缩进指南进行操作,否则会出现缩进错误。


6

如果您使用Sublime编写Python并出现缩进错误,

查看->缩进->将缩进转换为空格

我描述的问题是由Sublime文本编辑器引起的。同样的问题也可能由其他编辑器引起。从本质上讲,这个问题与Python希望以空格来处理缩进有关,而各种编辑器都以制表符来编写缩进。


哦...崇高是造成这个的原因吗?
nitin

是的,我描述的问题是由Sublime引起的。也可能由其他编辑器引起。从本质上讲,这个问题与Python希望以空格来对待缩进有关,而各种编辑器都以制表符来对缩进进行编码。
普纳内特·兰巴

我在记事本++中遇到了同样的问题。真切的目光如此,所以花了一些时间才能破解。我必须一次将光标移动一个字符,以找出编辑器已将某些空格转换为制表符
Bharat Anand

4

确保在编辑器中使用选项“插入空格而不是制表符”。然后,您可以选择所需的制表符宽度,例如4。您可以在gedit中的edit-> preferences-> editor下找到这些选项。

底线:使用空间而不是选项卡


您的底线成功了!
尼克·迪夫

3

将某些内容粘贴到Python解释器(终端/控制台)中时,也会发生此错误。

请注意,解释器会将空行解释为表达式的末尾,因此如果您粘贴类似

def my_function():
    x = 3

    y = 7

解释器将在解释之前将空行解释y = 7为表达式的末尾,也就是说,您已经完成了对函数的定义,而下一行- y = 7由于它是新表达式,因此缩进不正确。


关键在于函数定义内的空白行很好,它们仍必须具有初始空格,因为Python会将任何空白行解释为函数的末尾
MichaelChirico

3

似乎没有提到的一个问题是,由于与缩进无关的代码问题,此错误可能会出现。

例如,使用以下脚本:

def add_one(x):
    try:
        return x + 1
add_one(5)

IndentationError: unexpected unindent当问题当然是缺少except:语句时,这将返回。

我的观点:检查上面报告意外(un)缩进的代码!


2

如果缩进没问题,请查看您的编辑器是否具有“查看空白”选项。启用它应该可以找到空格和制表符混合的位置。


2

有一个对我总是有用的技巧:

如果您意外缩进,并且发现所有代码均已缩进,请尝试使用其他编辑器将其打开,然后您会看到未缩进的代码行。

当我使用vim,gedit或类似的编辑器时,这件事发生在我身上。

尝试仅将1个编辑器用于您的代码。


2

只需复制您的脚本,然后在整个代码“””下放入“”即可...

在变量中指定此行。

a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..

现在在Sublime Editor中使用ctrl + b执行此代码,现在它将在控制台中打印缩进的代码。而已


我将如何运行代码。我是否必须删除“”和“””以及打印文件a.replace并正常运行?
chibole

没有“”“”“”(三引号)引用您的内容而不是字符串。它的,因为你的代码可能包含字符串,它是单/双引号如此“””时需提供。
Mohideen本·穆罕默德·

2

您需要做的就是从以下代码的开头删除空格或制表符空格

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

运行以下命令以解决该问题:

autopep8 -i <filename>.py

这将更新您的代码并解决所有缩进错误:)

希望这能解决


非常容易实现。每次都为我工作,这就是为什么我希望分享对某人有益的原因:)
Sharyar Vohra

1

Notepad ++提供了正确的制表符空间,但最终在Sublime文本编辑器中发现了缩进问题。

使用Sublime文本编辑器并逐行进行


0

与许多其他编程语言不同,Python中的缩进很重要,这并不是为了代码可读性。如果连续命令之间的代码中有空格或制表符,则python将给出此错误,因为Python对此很敏感。当我们将代码复制并粘贴到任何Python时,我们很可能会遇到此错误。 确保使用文本编辑器(如Notepad ++)标识并删除这些空格,或者从出现错误的代码行中手动删除空格。

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

谢谢!

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.