Sunday, 21 February 2016

String comparison in Python: is vs. ==





I noticed a Python script I was writing was acting squirrelly, and traced it to an infinite loop, where the loop condition was while line is not ''. Running through it in the debugger, it turned out that line was in fact ''. When I changed it to !='' rather than is not '', it worked fine.



Also, is it generally considered better to just use '==' by default, even when comparing int or Boolean values? I've always liked to use 'is' because I find it more aesthetically pleasing and pythonic (which is how I fell into this trap...), but I wonder if it's intended to just be reserved for when you care about finding two objects with the same id.


Answer




For all built-in Python objects (like
strings, lists, dicts, functions,
etc.), if x is y, then x==y is also
True.





Not always. NaN is a counterexample. But usually, identity (is) implies equality (==). The converse is not true: Two distinct objects can have the same value.




Also, is it generally considered better to just use '==' by default, even
when comparing int or Boolean values?




You use == when comparing values and is when comparing identities.




When comparing ints (or immutable types in general), you pretty much always want the former. There's an optimization that allows small integers to be compared with is, but don't rely on it.



For boolean values, you shouldn't be doing comparisons at all. Instead of:



if x == True:
# do something


write:




if x:
# do something


For comparing against None, is None is preferred over == None.




I've always liked to use 'is' because
I find it more aesthetically pleasing
and pythonic (which is how I fell into

this trap...), but I wonder if it's
intended to just be reserved for when
you care about finding two objects
with the same id.




Yes, that's exactly what it's for.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...