is None or == None ?
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sat Nov 7 18:09:58 EST 2009
On Sat, 07 Nov 2009 14:22:28 -0800, sturlamolden wrote:
> On 6 Nov, 14:35, "Alf P. Steinbach" <al... at start.no> wrote:
>
>> As I understand it, 'is' will always work and will always be efficient
>> (it just checks the variable's type), while '==' can depend on the
>> implementation of equality checking for the other operand's class.
>
> '==' checks for logical equality. 'is' checks for object identity.
So far so good, although technically == merely calls __eq__, which can be
over-ridden to do (nearly) anything you like:
>>> class Funny(object):
... def __eq__(self, other):
... return self.payload + other
...
>>> f = Funny()
>>> f.payload = 5
>>> f == 10
15
> None is a singleton of type NoneType. Since None evaluates to True only
> when compared against itself,
That's wrong. None never evaluates to True, it always evaluates as None,
in the same way that 42 evaluates as 42 and [1,2,3] evaluates as [1,2,3].
Python literals evaluate as themselves, always.
Perhaps you mean that *comparisons* of None evaluate to True only if both
operands are None. That's incorrect too:
>>> None > None
False
You have to specify the comparison. It would be a pretty strange language
if both None==None and None!=None returned True.
> it is safe to use both operators.
Only if you want unexpected results if somebody passes the wrong sort of
object to your code.
>>> class NoneProxy:
... def __eq__(self, other):
... if other is None: return True
... return False
...
>>> o = NoneProxy()
>>> o is None
False
>>> o == None
True
You should use == *only* if you want to test for objects which are equal
to None, *whatever that object may be*, and is if you want to test for
None itself.
--
Steven
More information about the Python-list
mailing list