<var> is None vs. <var> == None

Benjamin Kaplan benjamin.kaplan at case.edu
Fri Jan 23 19:31:59 EST 2009


On Fri, Jan 23, 2009 at 7:28 PM, Gary Herron <gherron at islandtraining.com>wrote:

> Steven D'Aprano wrote:
> > On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:
> >
> >
> >> Hi -- Some time ago I ran across a comment recommending using <var> is
> >> None instead of <var> == None (also <var> is not None, etc.)
> >>
> >
> > That entirely depends on whether you wish to test for something which
> > *is* None or something with *equals* None. Those two things have
> > different meanings.
> >
>
> Actually, for None, those two things *are* the same.   If something
> *equals* None, it also *is* None.  This is a consequence of the fact
> that there is only ever one value of None anywhere in the system.


Not if someone decided to be a PITA.

>>> class A(object) :
...    def __eq__(self, other) :
...       return other is None
...
>>> a = A()
>>> a == None
True
>>> a is None
False


>
> > I wonder, do newbies actually get the impression from somewhere that "is"
> > is a synonym for "=="?
> >
>
> Yes.  Such questions pop up regularly, and are usually dealt with quickly.
>
> >
> >
> >
> >> My own
> >> testing indicates that the former beats the latter by about 30% on
> >> average.  Not a log for a single instruction but it can add up in large
> >> projects.
> >>
> >
> > If you have a "large" project where the time taken to do comparisons to
> > None is a significant portion of the total time, I'd be very surprised.
> >
> > var is None is a micro-optimization, but that's not why we do it. We do
> > it because usually the correct test is whether var *is* None and not
> > merely equal to None. Any random object might happen to equal None
> > (admittedly most objects don't), but only None is None.
> >
> >
> You don't have that quite right.  The only way something can *equal*
> None is if it *is* None.
> None is not a value an object can have, but rather it is a (singleton)
> object that can be referenced.  Setting something *equal* to None is
> accomplished by making it refer to the single None object, at which
> point it *is* None.
>
> Gary Herron
>
> >
> >
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090123/830ab8a1/attachment.html>


More information about the Python-list mailing list