Python is, == operator precedence

  • A+

In Python3,

a = b = 3 a is None == b is None 

returns False, but

(a is None) == (b is None) 

returns True. So I would assume based on this example alone, == has precedence over is.


a = b = None a is None == b is None 

returns True. And

(a is None) == (b is None) 

returns True. But

a is (None == b) is None 

returns False. In this case, it would seem as if is has precedence over ==.

To give another example, and this expression isn't meant to do anything, but bear with me please. If I say

None is None == None 

it returns True. But both of the following return False.

None is (None == None) (None is None) == None 

So clearly, Python isn't evaluating these with some strict precedence, but I'm confused what is going on. How is it evaluating this expression with 2 different operators, but differently from either order?


What you see here is operator chaining and there is no precedence involved at all!

Python supports expressions like

1 < a < 3 

To test that a number is in between 1 and 3; it's equal to (1 < a) and (a < 3) except that a is only evaluated once.

Unfortunately that also means that e.g.

None is None == None 

actually means

(None is None) and (None == None) 

which is of course True, and the longer example you started with

a = b = 3 a is None == b is None 


(a is None) and (None == b) and (b is None) 

which can only be True if both a and b are None.

Documentation here, see the bit about chaining.

Very useful sometimes but it also pops up when you least expect it!


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: