Python无法处理以0开头的数字字符串。为什么?

22

我刚刚在我的Python解释器上执行了以下程序:

>>> def mylife(x):
...     if x>0:
...             print(x)
...     else:
...             print(-x)
... 
>>> mylife(01)
File "<stdin>", line 1
mylife(01)
        ^
SyntaxError: invalid token
>>> mylife(1)
1
>>> mylife(-1)
1
>>> mylife(0)
0

我已经看过这个,但正如链接所说,Python中八进制的0不再起作用了(即在Python3中不再使用)。但是这不意味着以0开头的数字的行为就不能被正确地解释吗?无论是在二进制还是普通的十进制表示中都应该被解释。既然没有这样做,那么Python为什么要表现得这样呢?这是一个实现问题吗?还是一个语义问题?

2个回答

32

我猜测,由于在Python3.x中012不再是八进制字面常量,所以禁止使用012语法来避免奇怪的向后兼容问题。考虑一下你的Python2.x脚本使用八进制字面常量:

我的猜测是,由于Python3.x中的012不再是八进制字面常量,为了避免奇怪的向后兼容性问题,他们禁用了012语法。请考虑您的Python2.x脚本,其中使用了八进制字面常量:

a = 012 + 013

然后你将其移植到Python 3并且它仍然能够工作——只是会给你a = 25而不是你之前预期的a = 21(十进制)。祝你找到这个bug愉快。


好的。看起来是一个不错的解释,可以作为可能的设计决策。也许在两年后,当大部分内容都被移植后,我认为应该再次允许这个功能。谢谢! - user796530
18
让我想起那个“为什么程序员会把圣诞节和万圣节搞混”的笑话——“因为12月25日的十进制是31的八进制”;P - Jon Clements
@JonClements -- 我以前从未见过这个 -- 相当聪明 -- 我想这可能是我从未上过的某个计算机科学课程中提到的。 - mgilson
@mgilson,使用'0'可以正常工作,但使用'00'或'000'会导致出现"无效令牌"错误。 - SwissNavy
@SwissNavy -- 你的代码被psycopg2拒绝了,而不是Python。当你格式化SQL查询时,似乎发生了一些有趣的事情。这似乎与这个问题有所不同的根本问题。 - mgilson
显示剩余2条评论

15

来自Python 3发布说明http://docs.python.org/3.0/whatsnew/3.0.html#integers

八进制字面量不再采用形式0720; 请使用0o720

在Python 2.x中,八进制字面量的“前导零”语法是一个常见的陷阱:

Python 2.7.3
>>> 010
8

在Python 3.x中,正如您所发现的那样,这是一种语法错误:

Python 3.3.0
>>> 010
  File "<stdin>", line 1
    010
      ^
SyntaxError: invalid token

你仍然可以像以前一样将带有前导零的字符串转换:

>>> int("010")
10

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