DEV Community

Emad Mokhtar
Emad Mokhtar

Posted on

4

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 πŸ˜‰

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free