当前位置: 首页 > 面试题库 >

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

何和惬
2023-03-14
问题内容

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

例如:

>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
  File "<stdin>", line 1
    time(16, 01)
              ^
SyntaxError: invalid token
>>>

问题答案:

根据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的其余部分,前导零将仅在零整数上继续被接受。



 类似资料:
  • 问题内容: 我用来解析/验证用户输入。不幸的是,它在解析时允许字符作为后缀。 示例代码: 结果: 我实际上希望他们两个都有解析异常。我怎样才能告诉我不允许输入? 问题答案: 从以下文档中: 从给定字符串的开头解析文本以产生数字。 该方法可能不会使用给定字符串的整个文本。 这是一个示例,可以使您了解如何确保考虑整个字符串。 输出:

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。

  • 我将null传递给json.parse(),虽然第一个参数文档中说明它应该是一个字符串值,但它仍然可以提供。 为什么这不会抛出一个错误,即使文档声明这是用于字符串的,这能在多个浏览器中安全可靠地使用吗?

  • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

  • 问题内容: 我试图获取我的Layout 以适合我要移植到Java的程序的外观,在此之前,我已经使用了多个LayoutManager并获得了巨大的成功,但是由于某些原因,我似乎无法获得此布局都在工作。我的目标是有权利(东)侧的包含一个“查找下一个”和自上而下的命令“取消”按钮,然后在下面的任何额外的空间,从而使两个按钮总是在的顶部,但由于某种原因,它会不断忽略更改a宽度的任何尝试(这是我迷失的地方)

  • 这可能是一个复制品。但是经过一天的研究,我希望你能宽大处理。这是一个关于协方差的问题。 为什么我能这么做? 但不能这样做吗? 我读了一些关于协方差的讨论。 “C#中的协方差” “将列表转换为接口列表” “转换列表到接口列表” 我的理解是,我不能将狗的名单添加到动物名单中,因为这样我就可以将猫添加到动物名单中,这将是危险的。但是在动物列表中添加一个猫或狗的例子也同样危险,不是吗?在我看来,C#还没有