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.
Note that
bool
is a subclass ofint
, and thatTrue
has the integer value1
. To answer your question, if you want to check that some variable "is exactly True", you have to use the identity operatoris
. But that's really not pythonic... May I ask what's your real use case - IOW : why do you want to make a difference betweenTrue
,1
or any 'truth' value ?edit: regarding:
there is a case, and it's this:
additionally, if you're looking to use a singleton as a sentinel value, you can just create an object:
you don't want to use
if var == True:
, you really wantif var:
.imagine you have a list. you don't care if a list is "
True
" or not, you just want to know whether or not it's empty. so...check out this post for what evaluates to
False
: Evaluation of boolean expressions in PythonHere's a test that allows you to see the difference between the 3 forms of testing for True:
As you can see there are cases where all of them deliver different results.
Never use
is True
in combination with numpy (and derivatives such as pandas):This was unexpected to me as:
I guess the explanation is given by:
If you want to make sure that
foo
really is a boolean and of valueTrue
, use theis
operator.Otherwise, if the type of
foo
implements its own__eq__()
that returns a true-ish value when comparing toTrue
, you might end up with an unexpected result.As a rule of thumb, you should always use
is
with the built-in constantsTrue
,False
andNone
.In theory,
is
will be faster than==
since the latter must honor types' custom__eq__
implementations, whileis
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.
Most of the time, you should not care about a detail like this. Either you already know that
foo
is a boolean (and you can thus useif foo
), or you know thatfoo
is something else (in which case there's no need to test). If you don't know the types of your variables, you may want to refactor your code.But if you really need to be sure it is exactly
True
and nothing else, useis
. Using==
will give you1 == True
.