提问人: 提问时间:10/22/2012 最后编辑:Community 更新时间:4/10/2013 访问量:11592
Python 无法处理以 0 开头的数字字符串。为什么?
Python cannot handle numbers string starting with 0. Why?
问:
我刚刚在我的 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会这样呢?是实施问题吗?还是语义问题?
答:
32赞
mgilson
10/22/2012
#1
我的猜测是,由于在 python3.x 中不再是八进制文字常量,因此他们不允许使用语法以避免奇怪的向后兼容性错误。考虑使用八进制文字常量的 python2.x 脚本:012
012
a = 012 + 013
然后你把它移植到python 3,它仍然有效 - 它只是给你,而不是你之前预期的(十进制)。玩得开心追踪那个错误。a = 25
a = 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
八进制文字不再是形式;请改用。
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
评论