为什么在Python交互模式下,像01这样的数字会导致语法错误

5
为什么在Python交互模式下输入类似于01的数字会报错Syntax error?而当输入00时,解释器会计算为0。任何以0开头的数字如01001等都会报错invalid token。在prompt中输入1,000会计算为元组(1,0),但输入1,001不会得到(1,1),而是报错Syntax error。为什么Python解释器会这样表现呢?

当执行01时,它不会产生语法错误。解释器会输出1。 - Henrik Andersson
@limelights 这取决于Python的版本。2.7会返回1,而对我来说3.2会出现语法错误。 - Yuushi
@Yuushi 啊,我对 Python 3 不是很熟悉。我不知道它们取消了八进制字面量。 - Henrik Andersson
@limelights 我也是说实话没明白。 - Yuushi
只有八进制字面量的前导零语法已经消失了,而不是一般的八进制字面量。替代前缀“0o”(以及二进制的“0b”,自较早以来的十六进制的“0x”)从2.x系列后期可用(我认为是2.6,但可能要等到2.7)。 - lvc
2个回答

11

历史上,以零开头的整数字面值表示八进制数。这在Python 3中已经被废除,并且使用了不同的语法(0o...)。

旧语法不再接受,除非该数字完全由零组成

Python 3.3.0 (default, Dec  1 2012, 19:05:43) 
>>> 0
0
>>> 00
0
>>> 01
  File "<stdin>", line 1
    01
     ^
SyntaxError: invalid token

3
+1,附上文档链接以供解释:http://www.python.org/dev/peps/pep-3127/#removal-of-old-octal-syntax - Yuushi
你知道当数字完全由零组成时,为什么它会存在吗? - jamylak
1
@jamylak:我猜是由于缺乏歧义(000000所表示的数字没有任何不确定性)。虽然很难看出这会有什么实际的区别。 - NPE
@NPE 或许这样做是为了让人们在 IDLE 上按住“0”键时感到有趣。实际上,我现在意识到了原因,它有很多现实世界的应用,比如数字时间。 - jamylak
非歧义性论点对于所有数字基础以及之前的八进制数的01与00同样适用,但这更多地是Python本身的问题。 - guidot

2
在Python 2.x中,整数字面量前导的零表示它将被解释为八进制。在Python 3中取消了这一点,需要使用0o前缀。字面量中的前导零被保留为语法错误,以便依赖旧行为的旧代码会出现明显的错误而不是默默地给出“错误”的答案。

你有想法为什么这个功能会被移除吗?在大多数语言中,以0为前缀的数字是八进制的。 - Grijesh Chauhan
@GrijeshChauhan:这个决定的理由在PEP中有解释:http://www.python.org/dev/peps/pep-3127/#removal-of-old-octal-syntax - NPE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接