Boolean identity == True vs is True
boolean, cpython, jython, pypy, python
Solution
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.
Problem
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.