为什么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#还没有