Python Tricks— Object Comparisons:“is” vs “==”
When I was a kid, our neighbors had two twin cats. They looked seemingly identical–the same charcoal fur and the same piercing green eyes. Some personality quirks aside, you couldn’t tell them apart just from looking at them. But of course, they were two different cats, two separate beings, even though they looked exactly the same.
That brings me to the difference in meaning between equal and identical. And this difference is crucial to understanding how Python’s is and == comparison operators behave.
The == operator compares by checking for equality
The is operator, however, compares identities: if we compared our cats with the is operator, we’d get “these are two different cats” as an answer.
But before I get all tangled up in this ball-of-twine cat analogy, let’s take a look at some real Python code.
First, we’ll create a new list object and name it a, and then define another variable(b) that points to the same list object:
In [2]: a = [1, 2, 3]
In [3]: b = a
Let’s inspect these two variables. We can see that they point to identical-looking lists:
In [4]: a
Out[4]: [1, 2, 3]
In [5]: b
Out[5]: [1, 2, 3]
Because the two list objects look the same, we’ll get the expected result when we compare them for equality by using the == operator:
In [6]: a == b
Out[6]: True
However, that doesn’t tell us whether a and b are actually pointing to the same object. Of course, we know they are because we assigned them earlier, but suppose we didn’t know- how might we find out?
The answer is to compare both variables with the is operator. This confirms that both variables are in fact pointing to one list object:
In [7]: a is b
Out[7]: True
Let’s see what happens when we create an identical copy of our list object. We can do that by calling list() on the existing list to create a copy we’ll name c:
In [8]: c = list(a)
Again you’ll see that the new list we just created looks identical to the list object pointed to by a and b:
In [9]: c
Out[9]: [1, 2, 3]
Now this is where it gets interesting. Let’s compare our list copy c with the initial list a using the == operator. What answer do you expect to see?
In [10]: a == c
Out[10]: True
Okay, I hope this was what you expected. What this result tell us is that c and a have the same contents. They’re considered equal by Python. But are they actually pointing to the same object? Let’s find out with the is operator:
In [11]: a is c
Out[11]: False
Boom! This is where we get a different result. Python is telling us that c and a are pointing to two different objects,even though their contents might be the same.
So, to recap, let’s try and break down the difference between is and == into two short definitions:
- An is expression evaluates to True if two vairables point to the same(identical) object
- An == expression evaluates to True if the objects referred to by the variables are equal(have the same contents)
Just remember to think of twin cats(dogs should work, too) whenever you need to decide between using is and == in Python. If you do that, you’ll be fine.