Python是==运算符优先级

时间:2018-08-27 18:51:42

标签: python python-3.x operator-precedence nonetype

在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个不同的运算符来评估此表达式,但与任一顺序都不同?

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)

如果Truea均为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