cpburnz cpburnz - 7 months ago 33
Python Question

Boolean identity == True vs is True

It is standard convention to use

if foo is None
rather than
if foo == None
to test if a value is specifically
None
.

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
? Does this vary between implementations such as CPython (2.x and 3.x), Jython, PyPy, etc.?

Example: say
True
is used as a singleton value that you want to differentiate from the value
'bar'
, or any other true-like value:

if foo is True: # vs foo == True
...
elif foo == 'bar':
...


Is there a case where using
if foo is True
would yield different results from
if foo == True
?

NOTE: I am aware of Python booleans - if x:, vs if x == True, vs if x is True. However, it only addresses whether
if foo
,
if foo == True
, or
if foo is True
should generally be used to determine whether
foo
has a true-like value.




UPDATE: According to PEP 285 ยง Specification:


The values False and True will be singletons, like None.

Answer

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 don't 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 won't notice the speed difference in practice.