每https://docs.python.org/3/reference/lexical_analysis.html#integer-literals:
整数字面量由以下词法定义描述:
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"+
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
octinteger ::= "0" ("o" | "O") octdigit+
hexinteger ::= "0" ("x" | "X") hexdigit+
bininteger ::= "0" ("b" | "B") bindigit+
octdigit ::= "0"..."7"
hexdigit ::= digit | "a"..."f" | "A"..."F"
bindigit ::= "0" | "1"
整数文字的长度没有限制,除了
可以存储在可用内存中。
请注意,不允许在非零十进制数中使用前导零。
这是为了消除 C 风格的八进制文字的歧义,Python
在 3.0 之前使用。
如此处所述,非零十进制数中的前导零是不允许的。 "0"+ 作为一个非常特殊的情况是合法的,wasn't present in Python 2:
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN commit r55866 在标记器中实现了 PEP 3127,它禁止旧的 0<octal> 数字。然而,奇怪的是,它还添加了这个注释:
/* in any case, allow '0' as a literal */
带有一个特殊的 nonzero 标志,仅当以下数字序列包含非零数字时才会抛出 SyntaxError。
这很奇怪,因为PEP 3127 不允许这种情况:
此 PEP 提议将在 Python 3.0(以及 2.6 的 Python 3.0 预览模式)中删除使用前导零指定八进制数的功能,并且将在任何时候引发 SyntaxError前导“0”后紧跟另一个数字。
(强调我的)
因此,允许多个零的事实在技术上违反了 PEP,并且基本上是由 Georg Brandl 作为特例实现的。他对文档进行了相应的更改,指出"0"+ 是decimalinteger 的有效案例(之前已涵盖在octinteger 中)。
我们可能永远不会确切地知道为什么 Georg 选择使 "0"+ 有效 - 它可能永远是 Python 中一个奇怪的角落案例。
更新 [2015 年 7 月 28 日]:这个问题导致了一个关于 python-ideas 的lively discussion threadGeorg chimed in:
史蒂文·达普拉诺写道:
为什么要这样定义? [...] 为什么我们要写 0000 来得到零?
我可以告诉你,但我必须杀了你。
乔治
后来,产生了this bug report 的线程,旨在摆脱这种特殊情况。这里,Georg says:
我不记得这种故意更改的原因(从文档更改中可以看出)。
我现在无法为这种更改找到充分的理由 [...]
因此我们得到了它:这种不一致背后的确切原因已被时间遗忘。
最后,请注意错误报告已被拒绝:对于 Python 3.x 的其余部分,将继续仅接受零整数上的前导零。