在Python3中,
SettingsManager
返回False,但是
a = b = 3
a is None == b is None
返回True。因此,我认为仅基于此示例,==优先于 is 。
但是,
(a is None) == (b is None)
返回True。还有
a = b = None
a is None == b is None
返回True。但是
(a is None) == (b is None)
返回False。在这种情况下,似乎 is 的优先级高于==。
再举一个例子,这个表达式并不意味着要做什么,但是请忍受。如果我说
a is (None == b) is None
它返回True。但是以下两个都返回False。
None is None == None
很明显,Python并没有以严格的优先级评估它们,但是我对正在发生的事情感到困惑。如何使用2个不同的运算符来评估此表达式,但与任一顺序都不同?
答案 0 :(得分:15)
您在这里看到的是运营商链接,并且完全没有优先级!
Python支持类似
的表达式1 < a < 3
测试数字是否在1到3之间;它等于(1 < a) and (a < 3)
,除了a
仅被评估一次。
不幸的是,这也意味着例如
None is None == None
实际上是指
(None is None) and (None == None)
这当然是对的,而您开始的较长示例
a = b = 3
a is None == b is None
表示
(a is None) and (None == b) and (b is None)
如果True
和a
均为b
,则只能为None
。
文档here,请参见有关链接的内容。
有时非常有用,但在您最不期望的时候也会弹出!
答案 1 :(得分:2)
根据文档,所有python comparisons operators都具有相同的优先级:
Python中有八种比较操作。他们都有 相同的优先级(高于布尔运算)。
但是,通过用方括号括起来的比较,它们开始是atoms expressions,因此括号中的语句在外部语句之前先求值,这会影响评估的顺序,我将分解第一个“对比”情况,即所有其他都相似:
a = b = 3
a is None == b is None
每个文档的优先级相同,因此接下来是评估:
1. a is None ? -> False # Because a == 3
2. False == b -> False # Because b == 3
3. False is None
请在下面的第二种情况下查看订单:
(a is None) == (b is None)
1. a is None ? -> False # Because a == 3
2. b is None -> False # Because b == 3
3. False is False -> True