[Tutor] equality check difference

Peter Otten __peter__ at web.de
Sat Apr 19 23:48:00 CEST 2014


Vipul Sharma wrote:

> Hello,
> 
> Suppose we want some block of code to be executed when both '*a'* and
> '*b'*are equal to say 5. Then we can write like :
> 
> *if a == 5 and b == 5:*
> *    # do something*
> 
> But a few days ago, I just involuntarily wrote a similar condition check
> as
> :
> 
> *if a == b and b == 5:*
> *    # do something *
> 
> which made me think, is there any difference between the two ?
> 
> Is there any difference, any difference in the process of evaluation or
> execution ? and also which one is the better ?
> 
> I think this is a general programming question and not specifically for
> python.
> 
> P.S. : Newbie here :)

In mathematics there is a property called "transitivity" which basically 
says that an operation op is transitive if from

(a op b) and (a op c)

follows

b op c

Integer equality is such an operation, and this holds for Python, too. If a 
and b are integers you can safely assume that both conditions are 
equivalent. There is even a third way to spell this:

if a == b == 5:
   ...

But for arbitrary objects transitivity is not guaranteed, and you may see 
different outcomes. Here is a simple class that implements non-transitive 
equality:

>>> class A:
...     def __eq__(self, other):
...             return isinstance(other, int)
... 
>>> a = A()
>>> b = A()
>>> if a == 5 and b == 5:
...     print("yes")
... else:
...     print("no")
... 
yes
>>> if a == b and b == 5:
...     print("yes")
... else:
...     print("no")
... 
no

When you write a == b Python under the hood translates that to
a.__eq__(b), and when you implement your own __eq__() method you are free to 
do anything you like. You can even vary the output between calls:

>>> import random
>>> class B:
...     def __eq__(self, other):
...             return random.choice([True, False])
... 
>>> c = B()
>>> c == 42
False
>>> c == 42
False
>>> c == 42
True
>>> c == 42
False
>>> c == 42
True

Of course nobody (I hope) would recommend that you actually write such code.

PS: Can you guess what a == a prints?



More information about the Tutor mailing list