如何纠正python中的错误“意外缩进”?
18 回答
Python 使用行首的间距来确定代码块的开始和结束时间。您可能会遇到的错误是:
意外缩进。这行代码开头的空格比前面的多,但前面的不是子块的开头(例如 if/while/for 语句)。块中的所有代码行必须以完全相同的空白字符串开头。例如:
>>> def a():
... print "foo"
... print "bar"
IndentationError: unexpected indent
这在以交互方式运行 python 时特别常见:确保在命令之前不要放置任何额外的空格。(复制粘贴示例代码时非常烦人!)
>>> print "hello"
IndentationError: unexpected indent
Unndent 不匹配任何外部缩进级别。这行代码开头的空格比前一行少,但同样它与它可能属于的任何其他块都不匹配。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”命令pass:
>>> def foo():
... pass
允许混合制表符和空格(至少在我的 Python 版本中),但 Python 假定制表符长度为 8 个字符,这可能与您的编辑器不匹配。只需对标签说“不”。大多数编辑器允许它们自动替换为空格。
避免这些问题的最佳方法是在缩进子块时始终使用一致数量的空格,并且最好使用可以为您解决问题的良好 IDE。这也将使您的代码更具可读性。
在 Python 中,间距非常重要,它给出了代码块的结构。当您弄乱代码结构时会发生此错误,例如:
def test_function() :
if 5 > 3 :
print "hello"
您的文件中可能还会混合使用制表符和空格。
我建议您使用 Python 语法感知编辑器,例如PyScripter或Netbeans
使用 -tt 选项运行您的代码,以了解您是否在不一致地使用制表符和空格
在您使用的任何编辑器中打开可见空白并打开用空格替换制表符。
虽然您可以将标签与 Python 混合使用标签和空格,但通常会导致您遇到的错误。用 4 个空格替换制表符是编写 Python 代码的推荐方法。
通过使用正确的缩进。Python 可以识别空格,因此您需要遵循其对块的缩进指南,否则您会收到缩进错误。
如果你正在使用 Sublime 编写 Python 并遇到缩进错误,
查看 -> 缩进 -> 将缩进转换为空格
我描述的问题是由 Sublime 文本编辑器引起的。同样的问题也可能是由其他编辑引起的。从本质上讲,这个问题与 Python 希望根据空格处理缩进与各种编辑器根据制表符对缩进进行编码有关。
运行以下命令来解决它:
autopep8 -i <filename>.py
这将更新您的代码并解决所有缩进错误:)
希望这会解决
确保在编辑器中使用“插入空格而不是制表符”选项。然后您可以选择您想要的选项卡宽度,例如 4。您可以在 gedit 中的 edit-->preferences-->editor 下找到这些选项。
底线:使用空格而不是标签
似乎没有提到的一个问题是,由于与缩进无关的代码问题,可能会出现此错误。
例如,采用以下脚本:
def add_one(x):
try:
return x + 1
add_one(5)
IndentationError: unexpected unindent
当问题当然是缺少except:
语句时,这将返回。
我的观点:检查上面报告意外(未)缩进的代码!
将某些内容粘贴到 Python 解释器(终端/控制台)时也会发生此错误。
请注意,解释器将空行解释为表达式的结尾,因此如果您粘贴类似
def my_function():
x = 3
y = 7
解释器会将之前的空行解释y = 7
为表达式的结尾,即您已经完成了函数的定义,而下一行 -y = 7
将有不正确的缩进,因为它是一个新表达式。
有一个技巧一直对我有用:
如果你得到了意外的缩进并且你看到所有的代码都被完美地缩进了,试着用另一个编辑器打开它,你会看到哪一行代码没有缩进。
当我使用 vim、gedit 或类似的编辑器时,它发生在我身上。
尝试仅对您的代码使用 1 个编辑器。
如果缩进看起来没问题,那么看看你的编辑器是否有“查看空白”选项。启用此功能应该可以找到空格和制表符混合的位置。
这取决于上下文。另一个尚未涵盖的场景如下。假设您有一个文件,其中包含一个包含特定方法的类
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
pass
在文件的底部你有类似的东西
if __name__ == "__main__":
# some
# commands
# doing
# stuff
使整个文件看起来像这样
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
pass
if __name__ == "__main__":
# some
# commands
# doing
# stuff
例如,如果在 scrape_html() 中打开 if/else 语句
class Scraper:
def __init__(self):
pass
def scrape_html(self, html: str):
if condition:
pass
else:
if __name__ == "__main__":
parser = argparse.ArgumentParser()
您需要在pass
else 语句中添加或添加任何您想要的内容,否则您将得到
预期的缩进块
未预期不缩进
预期表达
并且在第一行
意外缩进
添加它pass
可以解决所有这四个问题。
您需要做的就是从以下代码的开头删除空格或制表符空格
from django.contrib import admin
# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
只需复制您的脚本并将您的整个代码“””放在“””下...
在变量中指定这一行.. 像,
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 执行此代码,现在它将在控制台中打印缩进代码。而已
Notepad++ 给出了正确的制表符空间,但最终在 Sublime 文本编辑器中发现了缩进问题。
使用 Sublime 文本编辑器并逐行执行
这取决于上下文,但缩进错误通常是由使用制表符而不是空格引起的。
您可以采取以下步骤来纠正此问题:
- 复制导致错误的制表符或空格
- 在您的 IDE 中进行查找和替换(通常是 Ctrl + H)。
- 将复制的制表符或空格粘贴到“查找”搜索栏中,然后将它们全部替换为 4 个空格(假设您的 IDE 使用 4 个空格作为“好的”缩进)
如果您将代码从外部源复制并粘贴到 IDE 中,也会经常发生此错误,因为其他地方的格式可能与您的 IDE 定义的“良好”缩进不匹配。
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]]
谢谢!