DEV Community

BC
BC

Posted on

Difference between `is` and `==` - Python Tips

We can compare 2 variables with is and == in Python:

>>> a = None
>>> b = None
>>> a is b
True
>>> a == b
True
Enter fullscreen mode Exit fullscreen mode

But what's the difference between these two?

The short answer is: is compares two variable's ID, and == compares their value.

Let's see an integer example:

>>> a = 2
>>> b = 2
>>> a is b
True
>>> a == b
True
>>> id(a)
4343713584
>>> id(b)
4343713584
Enter fullscreen mode Exit fullscreen mode

We can see a and b 's value are equal, and because their ID are the same, so is returns True too.

Let's see another example which is returns "False":

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a == b
True
>>> id(a)
4347529424
>>> id(b)
4347529360
Enter fullscreen mode Exit fullscreen mode

Let both a and b to be 257, we can see their values are equal, but is returns False.

Let's try 256:

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> id(a)
4343721712
>>> id(b)
4343721712
Enter fullscreen mode Exit fullscreen mode

Wait, if we use 256, both is and == returns True, because their ID and value are the same. But if we just increase one to 257, is will return False, so what happened here? Is 257 a special number in Python?

The answer is, to save some speed, Python put some small integers inside a pool. We all have the experience like using a loop to increase an integer from 1 to 10, since those small integers are frequently used, Python will create them once, and if there is another variable trying to use it, Python won't create a new one, it will just give this variable a reference to that number which is already created in the pool.

By default, Python put integers between [-5, 257) to that small integer pool, if you are interested, you can check CPython's source code here.

So this explained why is and == both returned True for 256. But for 257, Python will created two separated integer object to a and b, thus, their ID are different.

We can verify this with -5 and -6 too:

>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
Enter fullscreen mode Exit fullscreen mode

Reference

Top comments (0)