python – Boolean identity == True vs is True

python – Boolean identity == True vs is True

If you want to determine whether a value is exactly True (not just a true-like value), is there any reason to use if foo == True rather than if foo is True?

If you want to make sure that foo really is a boolean and of value True, use the is operator.

Otherwise, if the type of foo implements its own __eq__() that returns a true-ish value when comparing to True, you might end up with an unexpected result.

As a rule of thumb, you should always use is with the built-in constants True, False and None.

Does this vary between implementations such as CPython (2.x and 3.x), Jython, PyPy, etc.?

In theory, is will be faster than == since the latter must honor types custom __eq__ implementations, while is can directly compare object identities (e.g., memory addresses).

I dont know the source code of the various Python implementations by heart, but I assume that most of them can optimize that by using some internal flags for the existence of magic methods, so I suspect that you wont notice the speed difference in practice.

Never use is True in combination with numpy (and derivatives such as pandas):

In[1]: import numpy as np
In[2]: a = np.array([1, 2]).any()
In[4]: a is True
Out[4]: False
In[5]: a == True
Out[5]: True

This was unexpected to me as:

In[3]: a
Out[3]: True

I guess the explanation is given by:

In[6]: type(a)
Out[6]: numpy.bool_

python – Boolean identity == True vs is True

is there any reason to use if foo == True rather than if foo is True?

>>> d = True
>>> d is True
>>> d = 1
>>> d is True
>>> d == True
>>> d = 2
>>> d == True

Note that bool is a subclass of int, and that True has the integer value 1. To answer your question, if you want to check that some variable is exactly True, you have to use the identity operator is. But thats really not pythonic… May I ask whats your real use case – IOW : why do you want to make a difference between True, 1 or any truth value ?

Leave a Reply

Your email address will not be published. Required fields are marked *