为什么Python 3允许“ 00”作为0的文字,但不允许“ 01”作为1的文字?

发布于 2021-01-29 17:49:30

为什么Python 3允许“ 00”作为原义的0,却不允许“ 01”作为原义的1?有充分的理由吗?这种矛盾使我感到困惑。(我们正在谈论的是Python
3,它故意打破了向后兼容性以实现诸如一致性之类的目标。)

例如:

>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
  File "<stdin>", line 1
    time(16, 01)
              ^
SyntaxError: invalid token
>>>
关注者
0
被浏览
192
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    根据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"+作为一个非常特殊的情况是合法的,这在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预览模式)的语言中删除使用前导零指定八进制数的功能,并且 每当前导“
    0”为紧跟着另一个数字

    (强调我的)

    因此,允许多个零的事实在 技术上 违反了PEP,并且基本上由Georg
    Brandl实施为特殊情况。他进行了相应的文档更改,以注意到这"0"+是的有效案例decimalinteger(以前在中已涉及octinteger)。

    我们可能永远不会 确切 知道为什么Georg选择使之"0"+有效-在Python中它可能永远是一个奇怪的情况。


    更新 [2015年7月28日]:这个问题引发了关于python-
    ideas的热烈讨论Georg在其中进行了讨论

    史蒂文·达普拉诺(Steven D’Aprano)写道:

    为什么这样定义?[…]为什么我们写0000以得到零?

    我可以告诉你,但后来我不得不杀了你。

    格奥尔格

    稍后,该线程生成了此错误报告,旨在摆脱这种特殊情况。乔治在这里

    我不记得有意进行更改的原因(从文档更改中可以看出)。

    我现在无法提出更改的充分理由[…]

    因此,我们有了它:这种不一致背后的确切原因已经消失了。

    最后,请注意,该错误报告已被拒绝:对于Python 3.x的其余部分,前导零将仅在零整数上继续被接受。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看