运算符优先级:not、and和比较。

5
我正在努力更好地理解Python,缺少圆括号可能有点令人困惑。 (not a < b < c)如何计算? 是(not a) < b < c? 还是not (a < b < c)
根据参考手册not的优先级高还是低于<? 我假设优先级高的运算符比优先级低的运算符先运算,对吗? 我觉得我现在需要有人拿出袜子偶像了。 根据Python 2.4参考手册,not和比较具有不同的优先级。 然后在Python 2.7参考手册中,not和比较具有相同的优先级。 如果我没错的话not a < b < c会因Python版本的不同而产生不同的结果。 请问有人可以分享一下如何计算这个语句的?
我坚持使用not (a < b < c)

3
需要在需要特定评估顺序的地方添加括号。阅读您的代码的人将更加愉快,因为他们可以避免查看文档。 - JBernardo
2
理解代码的含义,远不止是运算符优先级。请注意,a < b < c(a < b) and (a < c) and (b < c)并不相同,有两个原因--您可以重载比较操作,所以它们不一定是可交换的,并且链式比较被展开为(a < b) and (b < c);它并不涉及到ac的关系。 - agf
2
我发现disast模块在这种情况下非常有帮助,例如:dis.dis(lambda a,b,c: not a < b < c)print(ast.dump(ast.parse('not a < b < c'))). 编译器是无可争议的。 - Eryk Sun
@eryksun 只有在你能理解编译器的情况下才有帮助... :) - Karl Knechtel
agf,我没有考虑过a<b<c被解释为f(a,b,c)。Eryksun,对的!我还没有真正使用过dis模块,非常有用!谢谢大家。 - Jake
1个回答

8
你在2.7手册中看到的都是关系运算符,包括"not in"和"is not",它们具有相同的优先级;布尔运算符"not"仍然比它们的优先级低一个等级,因此首先进行关系比较。

+1. 要明确的是,“关系比较”是 (a < b < c),它首先发生,因此结果在两种情况下等同于 not (a < b < c) - 尽管@Jake指出,最好使用括号明确表示,以便在更改Python版本或移植到另一种语言时不会有意外。 - Brian L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接