Which is more correct for compaing to None?
gball at cfa.harvard.edu
Sat May 12 21:42:25 EDT 2001
> Both of these seem to work. Which is more correct?
> if foo is None:
> print 'is'
> if foo == None:
> print '=='
I'm going to use 'foo is None' in future...
The context I use this in is default arguments:
def plot(seqy, seqy=None):
if seqx is None:
seqx = range(len(seqy))
# plot seqy vs. seqx
In the newest version of Numerical Python, 'a == None' raises an exception
if a is a Numpy array.
'is' should be completely safe since it just uses object identity (i.e.
it doesn't ask the object how to do the comparison). I believe python
guarantees there is a unique None object.
In principle the object identity check is faster, particularly if foo
happens to be an instance, since a lot less work gets done under the
covers. It might even be faster than a truth test, but more importantly a
truth test might not be the right behaviour in general, where foo == ''
is meaningful for example.
The standard library says
$ grep 'is None' /usr/lib/python2.2/*.py | wc -l
$ grep 'is not None' /usr/lib/python2.2/*.py | wc -l
$ grep '== None' /usr/lib/python2.2/*.py | wc -l
grep '!= None' /usr/lib/python2.2/*.py | wc -l
with the first example that comes up appearing in BaseHTTPServer.py.
More information about the Python-list