4

鉴于以下口译会话:

>>> def func(depth,width):
...   if (depth!=0):
...     for i in range(width):
...       print(depth,i)
...       func(depth-1,width)
  File "<stdin>", line 5
    func(depth-1,width)
                  ^
TabError: inconsistent use of tabs and spaces in indentation

有人可以告诉我TabError我的代码中有什么吗?

4

1 回答 1

11

TL;DR:从不使用缩进 Python 代码TAB


在 Python 2 中,的解释TAB就像使用 8 空格制表位转换为空格一样;也就是说,每个缩进都TAB将缩进增加 1 到 8 个空格,以便生成的缩进可以被 8 整除。

然而,这不再适用于 Python 3 - 在Python 3 中,空格和制表符的混合是 - 如果不总是 SyntaxError - 不是一件好事- 简化 [*],制表符仅匹配制​​表符,空格仅匹配缩进中的其他空格; 那是一个缩进的块TABSPACESPACE可能包含一个缩进的块TABSPACESPACETAB,但如果它包含TABTAB,它会被认为是一个缩进错误,即使该块看起来会进一步扩展。

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


[*] 好吧,我确实躺在那里——事情没那么简单。Python 3 实际上确实允许在以 . 缩进TABTABTABTAB的块内缩进TABSPACESPACE. 从Python 文档

2.1.8。缩进

逻辑行开头的前导空格(空格和制表符)用于计算行的缩进级别,而缩进级别又用于确定语句的分组。

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

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

由于TABTABTABTAB缩进比TABSPACESPACE制表符宽一个空格更深,因此实际上允许缩进。然而,这太神秘了,你不妨忘记它,只相信我上面所说的……甚至相信 Python 根本不允许使用TAB缩进。

于 2014-08-24T12:28:32.293 回答