【问题标题】:Python cannot handle numbers string starting with 0. Why?Python 无法处理以 0 开头的数字字符串。为什么?
【发布时间】:2012-10-12 09:26:02
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.x syntax-error


    【解决方案1】:

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

    a = 012 + 013
    

    然后你将它移植到 python 3,它仍然可以工作——它只是给你a = 25,而不是你之前预期的a = 21(十进制)。找到那个 bug 玩得开心。

    【讨论】:

    • 是的。似乎是一个很好的解释,作为可能的设计决策。可能在两年后,当大部分东西都被移植时,我认为应该再次允许该功能。谢谢!
    • 提醒“程序员为什么混淆圣诞节和万圣节” - “因为 dec(25) 是 oct(31)”;P
    • @JonClements -- 我以前从未见过那个 -- 相当聪明 -- 我想这可能在我从未上过的 CS 课程中提到过。
    • @mgilson 可能是很好的理由。这就解释了为什么000 仍然有效:stackoverflow.com/questions/43071916/…
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2012-07-14
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多