如何处理Python中的“意外缩进”?
如何解决Python中的“意外缩进”错误?
19 个回答
运行你的代码时加上 -tt 这个选项,这样可以检查你是否在使用制表符(Tab)和空格时不一致。
在Python中,空格的使用非常重要。这关系到你代码块的结构。
当你搞乱了代码的结构时,就会出现这个错误,比如下面这样:
def test_function():
if 5 > 3:
print "hello"
你的文件中可能还混合使用了制表符和空格。
我建议你使用一些支持Python语法的编辑器,比如 PyScripter 或者 NetBeans。
Python通过行首的空格来判断代码块的开始和结束。你可能会遇到以下几种错误:
意外的缩进。 这一行代码的开头空格比前一行多,但前一行并不是一个子块的开始(比如 if、while 和 for 语句)。在一个代码块中的所有行开头必须有完全相同数量的空格。例如:
>>> def a():
... print "foo"
... print "bar"
IndentationError: unexpected indent
这个错误在交互式运行Python时特别常见:确保你的命令前面没有多余的空格。(复制粘贴示例代码时特别烦人!)
>>> print "hello"
IndentationError: unexpected indent
缩进不匹配任何外部缩进级别。 这一行代码的开头空格比前一行少,但同样它也不符合任何其他可能的代码块。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
如果你想要一个什么都不做的函数,可以使用“无操作”命令 pass:
>>> def foo():
... pass
混合使用制表符和空格是允许的(至少在我用的Python版本中),但Python假设制表符的长度是8个字符,这可能和你的编辑器不一致。不要混合使用制表符和空格。 大多数编辑器允许自动将一种替换为另一种。如果你在团队中工作,或者参与开源项目,看看他们更喜欢哪种方式。
避免这些问题的最好方法是,在缩进子块时始终使用一致数量的空格,理想情况下使用一个好的IDE,这样可以为你解决这些问题。这也会让你的代码更易读。