【问题标题】:Strange chained comparison [duplicate]奇怪的链式比较[重复]
【发布时间】:2020-01-24 19:42:45
【问题描述】:
>>> a = 2
>>> b = 3
>>> c = 2
>>> b > a == c
True
>>>

b > a == c 等于 a < b and c == a 是否真的是因为它是一个链式比较?

这对我来说没有意义,因为 == 比较,我希望 b > a == c 等于 (b > a) == cb > (a == c)

【问题讨论】:

  • 链式适用于任何比较运算符,a op b op c 等价于(a op b) and (b op c)
  • a op b op c 只需计算/加载一次 b 的行为略有不同,而 (a op b) and (b op c) 必须这样做两次。解决您的问题的重复的具体答案是Chaining comparison operators
  • 根据@Barmar operator priority 的评论在这种情况下不起作用,因为它是一个链式比较,导致(a < b) and (c == a)
  • @Massifox:不正确。所有比较运算符(除了布尔运算符orandnothave equal precedence。括号只是阻止链接操作,因此您只需在括号内进行一个未链接的比较,结果用于括号外的未链接比较)。

标签: python comparison


【解决方案1】:

python 正在使用 if (b>a) AND (a==c) 自动更正您的比较

【讨论】:

  • "correcting" 意味着代码在某种程度上是错误的,Python 必须修复它。 Python 语言规范有意支持这种设计;使用它来链接大于等于测试是不寻常的(并且可能是程序员的错误)。
  • “可能是程序员的错误”。就是这样:PyCharm 建议简化 a < b and c == a,但它看起来不对。
  • @warvariuc:PyCharm 简化在很大程度上是正确的(除了a < b 的行为可能与b > a 不同,a == cc == a 的行为相同)。它必须加载a 两次,但它不那么令人困惑。如果 PyCharm 简化是错误的,这可能意味着您没有写出您想要的内容,并且需要额外的括号将其更正为 (b > a) == cb > (a == c)(假设其中一个是意图)。比较链对于范围测试之类的东西要直观得多,例如if 0 < x < 10: 作为一种简单的方法来检查 x 是否介于 010(不包括)之间。
  • @ShadowRanger See youtrack.jetbrains.com/issue/PY-37991 这就是我的问题的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2015-02-17
相关资源
最近更新 更多