根据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"
正如所述,整数字面值的长度没有限制,除了可用内存的限制。
请注意,在非零十进制数字中,不允许前导零。这是为了与Python 3.0之前使用的C风格八进制字面值区分开来。
如此指出,非零十进制数字中的前导零不被允许。但对于"0"+
,作为一种非常特殊的情况,这种写法在Python 2中是不允许的;详见此处。
integer ::= decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"
octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+
SVN 提交 r55866 在标记器中实现了 PEP 3127,禁止使用旧的 0<八进制数>
数字。然而,奇怪的是它也添加了这个注释:
使用特殊的nonzero
标志,仅当以下数字序列包含非零数字时才引发SyntaxError
异常。
这很奇怪,因为PEP 3127不允许这种情况:
该PEP建议从Python 3.0(以及2.6的Python 3.0预览模式)中删除使用前导零指定八进制数的能力,并且只有当前导“0”紧随另一个数字时,才会引发SyntaxError。
(强调我的)
因此,允许多个零的事实在技术上违反了PEP,并且基本上是由Georg Brandl作为特例实现的。他进行了相应的文档更改,指出“0”+
是decimalinteger
的有效情况(以前已经被octinteger
覆盖)。
我们可能永远不会确切地知道Georg选择使“0”+
有效的原因 - 它可能会一直保留在Python的奇怪角落中。
更新 [2015年7月28日]:这个问题引发了一个关于python-ideas的热烈讨论主题,其中Georg参与了其中:
Steven D'Aprano写道:
为什么会定义成那样?[...] 为什么我们要写0000来得到零?
我可以告诉你,但然后我就得杀了你。
Georg
后来,该帖子衍生出这个错误报告,旨在摆脱这种特殊情况。在此,Georg说:
我不记得这个故意更改的原因(从文档更改中看到)。
我现在无法想出这种更改的好理由[...]
因此,我们拥有它:这种不一致性背后的确切原因已经逝去。
最后,请注意,该错误报告已被拒绝:在Python 3.x的其余部分中,仅接受零整数的前导零。