Figure 1: Photo by Rajiv Perera on Unsplash
== is comparing values
In Python, == compares the value of two variables and returns True as long as the values are equal.
>>> a = "hello cat"
>>> b = "hello cat"
>>> a == b
True
>>> b = "hello dog"
>>> a == b
False
is
is comparing object references
is
compares the ids of two variables.
That is, the actual comparing is id(a) == id(b), and it will return True only if the two variables point to the same object.
>>> a = "hello cat"
>>> b = a
>>> a is b
True
>>> b is a
True
>>> b = "hello cat"
>>> a is b
False
>>> id(a)
4512387504
>>> id(b)
4512387312
As we can see from the result, even the value of b
is still the same with a
, the variable of b
is bind with a different object. So, a is b will return False.
An Exception for is
According to the above explanation, this code snippet should output False.
a = 2
b = 2
print (a is b)
But in fact, it will output True, because Python has a cache mechanism for small integers. The number between -5 and 256 will be cached. In this case since a
and b
have the same value, they point to the same object.
Unicode characters decimals 0 to 255 are also initialized when a Python session is started. So
>>> a = chr(80)
>>> a
'P'
>>> b = chr(80)
>>> b
'P'
>>> a is b
True
>>> a = chr(937)
>>> a
'Ω'
>>> b = chr(937)
>>> b
'Ω'
>>> a is b
False
is
will be more complicated when we comparing two strings. Generally, strings longer than 20 characters will be interned.
>>> a = "coderscat"
a = "coderscat"
>>> b = "coderscat"
b = "coderscat"
>>> a is b
True
But any string constructed at runtime (produced through methods, functions, etc.) will not be interned.
>>> a = 'coderscat'
>>> b = "".join(['c', 'o', 'd', 'e', 'r', 's', 'c', 'a', 't'])
>>> a is b
False
>>> a == b
True
Which one to use
If you want to compare values, always choose to use euqal
.
Since the return value of is
also depends on the cache strategy in Python, we have limited use-cases for it.
In some scenarios, we need to use is
to check whether two variables refer to the same object.
Top comments (0)