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

Python cannot handle numbers string starting with 0. Why?

提问人: 提问时间:10/22/2012 最后编辑:Community 更新时间:4/10/2013 访问量:11592

问:

我刚刚在我的 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

现在,我已经看到了这一点,但正如链接所说,八进制的 0 在 python 中不再起作用(即在 python3 中不起作用)。但是,这难道不意味着应该正确解释以 0 开头的数字的行为吗?是以 2 为基数还是以 10 为基数表示?既然不是这样,为什么python会这样呢?是实施问题吗?还是语义问题?

python-3.x 语法错误

评论


答:

32赞 mgilson 10/22/2012 #1

我的猜测是,由于在 python3.x 中不再是八进制文字常量,因此他们不允许使用语法以避免奇怪的向后兼容性错误。考虑使用八进制文字常量的 python2.x 脚本:012012

a = 012 + 013

然后你把它移植到python 3,它仍然有效 - 它只是给你,而不是你之前预期的(十进制)。玩得开心追踪那个错误。a = 25a = 21

评论

0赞 10/22/2012
是的。似乎是一个很好的解释,作为可能的设计决策。可能在两年后,当大部分东西都被移植时,我认为,这个功能应该再次被允许。谢谢!
18赞 Jon Clements 1/29/2013
让人想起“为什么程序员会混淆圣诞节和万圣节”——“因为 dec(25) 是 oct(31)”;P
0赞 mgilson 1/29/2013
@JonClements -- 我以前从未见过 -- 很聪明 -- 我想这可能是在我从未上过的一门 CS 课上提到过的。
0赞 Jean-François Fabre 9/2/2017
@mgilson可能是很好的理由。这解释了为什么仍然有效:stackoverflow.com/questions/43071916/......000
0赞 SwissNavy 2/16/2023
@mgilson使用“0”它可以工作,使用“00”或“000”它会失败,给出“无效令牌”错误
15赞 Colonel Panic 4/10/2013 #2

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

八进制文字不再是形式;请改用。07200o720

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