36

我决定,我学习一点 Python。第一个介绍说它使用缩进来分组语句。虽然最好的习惯显然是只使用其中一种,但如果我互换它们会发生什么?多少个空格将被视为等于一个制表符?或者如果制表符和空格混合在一起,它会完全不起作用吗?

4

7 回答 7

41

空格不被视为等同于制表符。使用制表符缩进的行与缩进 1、2、4或 8个空格的行的缩进不同。

通过反例证明(错误的,或者充其量是有限的 - 制表符!= 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 说:

首先,将制表符替换为(从左到右)一到八个空格,这样直到并包括替换的字符总数是八的倍数(这与 Unix 使用的规则相同)。第一个非空白字符之前的空格总数决定了行的缩进。缩进不能使用反斜杠分割成多条物理行;第一个反斜杠之前的空格决定缩进。

Python 3 说:

制表符被一到八个空格替换(从左到右),这样直到并包括替换的字符总数是八的倍数(这旨在与 Unix 使用的规则相同)。第一个非空白字符之前的空格总数决定了行的缩进。缩进不能使用反斜杠分割成多条物理行;第一个反斜杠之前的空格决定缩进。

(除了开头的单词“First”之外,这些都是相同的。)

Python 3 增加了一个额外的段落:

如果源文件混合制表符和空格的方式使含义取决于空格中制表符的价值,则缩进会被拒绝;在这种情况下会引发 TabError。

这意味着在 Python 2 中运行的TABvs 8-space 示例将在 Python 3 中生成 TabError。最好(在 Python 3 中是必需的)确保组成块中每一行的缩进的字符序列相同. PEP8说“每个缩进级别使用 4 个空格”。(谷歌的编码标准说“使用 2 个空格”。)

于 2010-01-09T18:59:33.023 回答
21

遵循Python 风格的PEP 8。PEP 8 说:缩进

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

对于您不想弄乱的真正旧代码,您可以继续使用 8 空格制表符。

制表符还是空格?

切勿混合制表符和空格。

Python 最流行的缩进方式是仅使用空格。第二种最流行的方式是仅使用选项卡。使用制表符和空格混合缩进的代码应转换为仅使用空格。当使用 -t 选项调用 Python 命令行解释器时,它会发出有关非法混合制表符和空格的代码的警告。使用 -tt 时,这些警告会变成错误。强烈推荐这些选项!

于 2010-01-09T19:02:22.890 回答
11

在 Python 2 中, 的解释TAB就像使用 8 空格制表位将其转换为空格(如先前的答案已经提供的那样);也就是说,每个缩进都TAB将缩进增加 1 到 8 个空格,以便生成的缩进可以被 8 整除。

但是,这不再适用于 Python 3 - 在Python 3 中,空格和制表符的混合始终是错误的- 制表符仅匹配制​​表符,空格仅匹配缩进中的其他空格;那是一个缩进的块TABSPACESPACE可能包含一个缩进的块TABSPACESPACETAB,但没有一个缩进的块TABTABTAB,这将被认为是缩进错误,即使该块似乎会进一步扩展:

如果源文件混合制表符和空格的方式使含义取决于空格中制表符的价值,则缩进会被拒绝;在这种情况下会引发 TabError。

即算法的工作原理如下:

  • 如果制表符数空格数都与上一行匹配(无论顺序如何),则该行与上一行属于同一块

  • 如果(制表符,空格)之一的数量大于上一行,而另一个的数量至少等于上一行,则这是一个缩进块

  • 元组(tabs, spaces)匹配前一个块的缩进 - 这缩进到那个块

  • 否则 aIndentationError或 aTabError被提出。

这就是为什么在 Python 中混合使用制表符和空格,甚至使用制表符进行缩进都被认为是一种非常糟糕的做法。

于 2014-08-24T12:30:16.277 回答
6

只是不要互换它们 :)
将您的 IDE/编辑器设置为在按下“tab”时输入 4 个空格,您就可以开始了。

于 2010-01-09T19:01:18.853 回答
5

我建议您阅读PEP 8,它是 Python 代码的“官方”Python 风格指南。它包括(除其他外)制表符/空格的使用。

于 2010-01-09T19:01:45.157 回答
2

四个空格是一个选项卡(在我的设置中),但据我所知,它们没有互换。您可以使用空格或制表符,不能同时使用两者。

于 2010-01-09T18:59:05.677 回答
-2

I believe that the tab character should simply never appear in source code under any circumstances. There's no advantage to it and it's an endless source of tiny errors. - use a character string with \t if you need a tab, it has the advantage that it's self-documenting.

Here's the classic article about tabs vs spaces - I use a variant of jwz's elisp in my own .emacs file.

(I confess to personally breaking with PEP 8 by using only 2 characters' indentation - 4 characters is a lot when your lines are only 80 characters...)

于 2010-01-09T23:04:40.820 回答