【问题标题】:Comparison operators and 'is' - operator precedence in python?比较运算符和'is' - python中的运算符优先级?
【发布时间】:2015-08-24 12:19:52
【问题描述】:

所以我在网上查看了一些code,我遇到了一行(在第 286 行):
if depth > 0 and best <= -MATE_VALUE is None and nullscore > -MATE_VALUE:

我无法理解的部分是best <= -MATE_VALUE is None。

所以我启动了解释器,看看像value1 > value2 is value3 这样的语句是如何工作的。
所以我尝试了

>>> 5 > 2 is True
False

>>> (5 > 2) is True 
True

>>> 5 > (2 is True) 
True


我的问题

为什么5 > 2 is True 不是True?这些东西通常是如何工作的?

谢谢。

【问题讨论】:

  • 查找运算符链。这实际上不是优先级问题。第一个在逻辑上被视为(5 > 2) && (2 is True),这就是Python 允许有意义的a < x < b 构造的原因/方式。关于这个有重复。
  • FWIW,这条线对我来说似乎很奇怪——我不清楚这个表达式什么时候会是真的。如果 MATE_VALUE 是一个数字(可能是因为 -MATE_VALUE),那么它永远不会是 None (如果是,- 将不起作用。)所以如果该行没有抛出异常,赢了不是总是返回 False 吗?
  • 我认为写这篇文章的人可能比你更困惑。实际的解释 (best <= -MATE_VALUE and -MATE_VALUE is None) 和任何看似不正确的解释 ((best <= -MATE_VALUE) is None 或 best <= (-MATE_VALUE is None)) 都没有任何意义。

标签: python python-3.x


【解决方案1】:

你看到 python 的操作符链在工作

5 > 2 is True

相当于

5>2 and 2 is True

你可以在里面看到这个

>>> 5>2 is 2

返回True。

【讨论】:

    【解决方案2】:

    首先,5 > 2 is True 等价于 (5 > 2) and (2 is True),因为 python 中的运算符链接(第 5.9 节 here)。

    很明显,5 > 2 的计算结果为 True。但是,2 is True 将评估为 False,因为它不会隐式转换为 bool。如果你强制转换,你会发现bool(2) is True 产生True。 if-statement 等其他语句将为您执行此转换,因此 if 2: 将起作用。

    其次,is 运算符和== 运算符之间有一个重要区别(取自here):

    当您想要检查对象的身份时使用is(例如 检查以查看if var is None)。当你想检查时使用== 相等(例如 var 是否等于 3?)。

    >> [1,2] is [1,2]
    False
    
    >> [1,2] == [1,2]
    True
    

    虽然这不会对本示例产生直接影响,但您应该牢记这一点,以备不时之需。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多