DEV Community

Emad Mokhtar
Emad Mokhtar

Posted on

Difference between `==` and `is` in Python, and when to use each of them

In Python there are many comparison operators; you always use them to check something in your code and let your code take decision according to the comparison

In this article, I want to go deep with two operators == to check equality, and is to check identity.

The == operator

The equality comparison operator.

>>> 1 == 1 True 
Enter fullscreen mode Exit fullscreen mode

In the above code, we are checking whether the value of int 1 is an equal value of int 1, in other words, we are checking the values equality here.

class Number: def __init__(self, number): self.number = number >>> Number(1) == Number(1) False # Wooot 
Enter fullscreen mode Exit fullscreen mode

In the above code, we are checking if the values of 2 objects are equal. They are not equal. Classes in Python 🐍 have dunder methods to implement special logic of magic.

via GIPHY

For example, __init__() is dunder method to initiate a new object or the class constructor. For our example above, there is a dunder method used to check the equality which is __eq__() , if we implement it correctly, the expression in the code about should work.

class Number: def __init__(self, number): self.number = number def __eq__(self, another_number): if isinstance(another_number, Number): return self.number == another_number.number return self.number == another_number >>> Number(1) == Number(1) True >>> Number(1) == 1 True 
Enter fullscreen mode Exit fullscreen mode

All right, now our class has a correct equality logic. The equality logic is implemented in __eq__ method. It is also implemented in Python built-in types like Integers.

import inspect from pprint import pprint # 1 is object of int class pprint(inspect.getmembers(1)) pprint(inspect.getmembers(int)) 
Enter fullscreen mode Exit fullscreen mode

The is operator

The identity check operator

>>> none_obj = None >>> none_obj is None True >>> number_one = 1 >>> number_one is 1 
Enter fullscreen mode Exit fullscreen mode

In Python, every object created will store a reference to it, like in the above code none_obj which is storing a reference to None , and number_one object is storing a reference to 1. Let’s examine how this is done by Python.

>>> none_obj = None >>> id(none_obj) 4304631824 >>> id(None) 4304631824 >>> id(number_one) 4304948352 >>> id(1) 4304948352 
Enter fullscreen mode Exit fullscreen mode

When you create a new variable that stores an object or value, this variable name stores a reference to it, so if you create another variable to store the same object, Python stores a pointer to this object instead of creating a new one.

a = Number(1) b = a >>> id(a), id(b) (4520963656, 4520963656) >>> a is b True 
Enter fullscreen mode Exit fullscreen mode

Technically speaking, when you check the identity, Python checks id(a) == id(b), which means:
Do objects a and b refer to the same object? So the answer will be True if they refer to the same object.

Conclusion

If you need to check the value equality, use the == operator and if you need to check whether 2 objects are the same, use is.

Happy Pythoning 😉

Top comments (0)