【问题标题】:operator precedence: not and comparisons运算符优先级:非和比较
【发布时间】:2021-08-27 06:26:41
【问题描述】:

我正在尝试更好地理解 python,但由于某种原因,缺少括号可能会有点令人困惑。

如何评估(not a < b < c)?是(not a) < b < c吗?或not (a < b < c)?

根据reference manualnot 的优先级是否低于或高于<?我假设具有较高优先级的运算符先于具有较低优先级的运算符进行评估,对吗?我觉得我现在需要有人来打破袜子木偶。

根据Python 2.4 reference manual not 和比较有不同的优先级。那么在Python 2.7 reference manual中不和比较具有相同的优先级。

如果我没记错的话not a < b < c 会根据 python 的版本产生不同的结果。有人可以分享一下这个陈述是如何评估的吗?

我坚持not (a < b < c)

【问题讨论】:

  • 在需要特定评估顺序的地方添加括号。阅读您的代码的人会更乐意避免检查文档
  • 理解该代码比运算符优先级要多。注意a < b < c(a < b) and (a < c) and (b < c) 不同,原因有两个——您可以重载比较,因此它们不一定是可交换的,并且链式比较扩展为(a < b) and (b < c);它与ac 无关。
  • 我发现 disast 模块对解决此类问题很有帮助,例如dis.dis(lambda a,b,c: not a < b < c)print(ast.dump(ast.parse('not a < b < c')))。无需与编译器争论。
  • @eryksun 只有在你能理解编译器的情况下才有帮助...... :)
  • agf,我没想到 a

标签: python


【解决方案1】:

您在 2.7 手册中看到的是所有关系运算符,包括not inis not,优先级相同; boolean not 的优先级仍然低一级,因此关系比较首先发生。

【讨论】:

  • +1。需要明确的是,“关系比较”是(a < b < c),它首先发生,所以在这两种情况下结果都等同于not (a < b < c)——尽管@Jake 提出了一个很好的观点,即通常最好用括号使其明确,所以有如果更改 python 版本或移植到另一种语言,这不足为奇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多