【问题标题】:Python: Syntax error:Invalid tokenPython:语法错误:无效的令牌
【发布时间】:2016-10-18 18:40:55
【问题描述】:

我刚开始学习 pyhton,在使用比较运算符时,当我使用 '==' 运算符执行以下代码时出现此错误,

40 == 0040.0

结果为真,从解释器,也

40 == 40.0

结果为真

但是当我执行下面的代码时,

40 == 0040

它抛出了一个错误,

文件“stdin”,第 1 行

40 == 0040

语法错误:无效标记

将无效标记指向尾随零。

请帮助我了解发生了什么。在此先感谢您。

【问题讨论】:

  • 0040 as 000040 已经被视为十六进制,如果你 int(0040) 或 int(000040) 你会得到 32
  • @dmitryro 你是说八进制吗?
  • @dmitryro 0040 是一个 SyntaxError,而不是十六进制或八进制数(后者应该有 0o 而不是 00。找出不同之处。)
  • 嗨 dmitryro:在转换为 int 之前,它必须转换为十进制对吗?如果我没有错
  • @SubSea 供您参考docs.python.org/3/reference/…

标签: python python-3.x


【解决方案1】:

Python 3 不允许数字带有前导零,以防止与八进制值混淆。如果必须有前导零,请使用format()

在 Python 2 中,40 == 0040 的计算结果为 False 更加清晰。

编辑:取自评论链接的示例:

>>> "{0:0>3}".format(1) '001'

进一步说明:

{0 : 0 > 3} │ │ │ │ │ │ │ └─ Width of 3 │ │ └─ Align Right │ └─ Fill with '0' └─ Element index

【讨论】:

【解决方案2】:

对于浮点数,前导零被接受,并且它们被忽略(因为它们除了可读性之外没有任何贡献)。 因此,0040.0 是浮点数40.0

对于整数,数字开头的零具有不同的含义:根据下一个字符,它表示数字的其余部分应解释为八进制(oO),十六进制(xX)或二进制数(bB)。
如果另一个字符跟在第一个 0 之后,它将是 SyntaxError。这就是您在0040 看到的内容:没有提示它应该是浮点数(没有'e'、'd' 或小数点'.'),第二个零也不是前缀对于不同的整数基数。

浮点数和整数的确切定义在lexical analysis of the Python reference 中给出。


你的比较结果评估为True 是一个不同的野兽,它只是表明浮点 40 恰好是一个精确的表示,等于整数 40。

(有关整数和浮点数的方式和原因,请参见例如关于the first integer that can't be represented by a float 的 SO 问题。)

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多