Python 对制表符和空格的缩进解释

41 投票
7 回答
66854 浏览
提问于 2025-04-15 17:50

我决定学习一点Python。最开始的介绍提到,Python使用缩进来分组语句。虽然最好的习惯是只使用一种缩进方式,但如果我把它们混在一起会发生什么呢?几个空格算不算一个制表符?如果混用制表符和空格,程序会完全不工作吗?


请使用 我遇到了IndentationError(或者TabError)。我该如何解决? 来关闭那些因为混用制表符和空格导致 TabError 的问题。这问题主要是关于这种缩进是如何被解释的,而不是为什么会造成问题或如何解决。

7 个回答

15

在Python 2中,按下TAB键的效果就像是用8个空格来替代它,也就是说每按一次TAB,缩进就增加1到8个空格,这样最终的缩进总是能被8整除。

但是在Python 3中情况就不一样了——在Python 3中,混用空格和制表符(TAB)总是会出错——制表符只和制表符匹配,空格只和空格匹配。如果一个代码块是用TABSPACESPACE缩进的,而另一个代码块是用TABSPACESPACETAB缩进的,那它们是可以的,但如果是用TABTABTAB缩进的,就会被认为是缩进错误,尽管看起来这个块的缩进更深:

如果一个源文件在缩进中混合了制表符和空格,使得缩进的意义依赖于制表符的空格数量,那么就会被拒绝,系统会抛出一个TabError错误。

也就是说,缩进的规则是这样的:

  • 如果当前行的制表符和空格的数量都和上一行相同(不管顺序如何),那么这一行就属于和上一行同一个代码块。

  • 如果制表符或空格的数量大于上一行,而另一种的数量至少和上一行相等,那么这是一个缩进块。

  • 元组(tabs, spaces)与之前的一个块的缩进相匹配——这就表示缩进回到那个块。

  • 否则就会抛出IndentationErrorTabError错误。

因此,在Python中混用制表符和空格,或者使用制表符进行缩进,都是非常不好的做法。

23

遵循 PEP 8 来编写 Python 代码风格。PEP 8 规定:

每个缩进级别使用 4 个空格。

对于一些很旧的代码,如果你不想去改动它,可以继续使用 8 个空格的制表符。

制表符还是空格?

绝对不要混用制表符和空格。

在 Python 中,最常用的缩进方式是只用空格。第二常用的方式是只用制表符。用混合的制表符和空格缩进的代码应该转换成只使用空格。使用 -t 选项启动 Python 命令行解释器时,会对混合使用制表符和空格的代码发出警告。如果使用 -tt,这些警告会变成错误。强烈推荐使用这些选项!

46

空格和制表符(Tab)是不同的。用制表符缩进的行和用1、2、4个空格缩进的行,缩进的程度是不一样的。

通过反例证明这一点(虽然这个证明可能有误,或者说只是有限的 - 制表符不等于4个空格):

x = 1
if x == 1:
^Iprint "fff\n"
    print "yyy\n"

这里的'^I'表示一个TAB。在Python 2.5中运行时,我得到了一个错误:

  File "xx.py", line 4
    print "yyy\n"
                ^
IndentationError: unindent does not match any outer indentation level

这说明在Python 2.5中,制表符和空格是不相等的(特别是和4个空格不相等)。


哎呀,尴尬;我的反例证明了制表符和4个空格是不一样的。正如Alex Martelli在一个评论中指出的,在Python 2中,制表符等于8个空格,调整这个例子用一个制表符和8个空格就能证明这一点。

x = 1
if x != 1:
^Iprint "x is not 1\n"
        print "y is unset\n"

在Python 2中,这段代码可以正常运行,不会打印任何内容。


在Python 3中,规则稍微有点不同(正如Antti Haapala所提到的)。对比一下:

Python 2的说法是:

首先,制表符会从左到右被替换为1到8个空格,使得替换后的总字符数是8的倍数(这和Unix的规则是一样的)。然后,首个非空字符之前的空格总数决定了这一行的缩进。缩进不能通过反斜杠跨越多行;到第一个反斜杠之前的空白部分决定了缩进。

Python 3的说法是:

制表符会从左到右被替换为1到8个空格,使得替换后的总字符数是8的倍数(这和Unix的规则是一样的)。然后,首个非空字符之前的空格总数决定了这一行的缩进。缩进不能通过反斜杠跨越多行;到第一个反斜杠之前的空白部分决定了缩进。

(除了开头的“首先”一词,这两者是完全相同的。)

Python 3还增加了一段内容:

如果源文件中混合使用制表符和空格,导致缩进的含义依赖于制表符的空格值,那么这种缩进会被认为是不一致的;在这种情况下会抛出TabError错误。

这意味着在Python 2中有效的制表符和8个空格的例子,在Python 3中会产生TabError错误。在Python 3中,确保每个代码块中每行的缩进字符序列是相同的,这是最好的做法,也是必须的。PEP8建议“每个缩进级别使用4个空格”。(谷歌的编码标准建议“使用2个空格”。)

撰写回答