Python是,==运算符优先级

Jon*_*ang 15 python operator-precedence python-3.x nonetype

在Python3中,

a = b = 3
a is None == b is None
Run Code Online (Sandbox Code Playgroud)

返回False,但是

(a is None) == (b is None)
Run Code Online (Sandbox Code Playgroud)

返回True.所以我假设仅基于这个例子,==优先于is.

然而,

a = b = None
a is None == b is None
Run Code Online (Sandbox Code Playgroud)

返回True.和

(a is None) == (b is None)
Run Code Online (Sandbox Code Playgroud)

返回True.但

a is (None == b) is None
Run Code Online (Sandbox Code Playgroud)

返回False.在这种情况下,它会看起来好像就是有优先==.

再举一个例子,这个表达并不意味着什么,但请耐心等待.如果我说

None is None == None
Run Code Online (Sandbox Code Playgroud)

它返回True.但是以下两个都返回False.

None is (None == None)
(None is None) == None
Run Code Online (Sandbox Code Playgroud)

很明显,Python并没有用一些严格的优先级来评估它们,但是我很困惑发生了什么.如何用2个不同的运算符来评估这个表达式,但是不同于任何一个运算符?

Rem*_*ich 15

你在这里看到的是操作员链接,并没有任何优先权!

Python支持类似的表达式

1 < a < 3
Run Code Online (Sandbox Code Playgroud)

测试一个数字在1到3之间; 这等于(1 < a) and (a < 3)除了a只计算一次.

不幸的是,这也意味着,例如

None is None == None
Run Code Online (Sandbox Code Playgroud)

实际意味着

(None is None) and (None == None)
Run Code Online (Sandbox Code Playgroud)

这当然是真的,也是你开始的更长的例子

a = b = 3
a is None == b is None
Run Code Online (Sandbox Code Playgroud)

手段

(a is None) and (None == b) and (b is None)
Run Code Online (Sandbox Code Playgroud)

这只能是True如果两个abNone.

这里有文档,请看有关链接的内容.

有时非常有用但是当你最不期望它时它也会弹出!