On Apr 27, 2011, at 2:37 AM, Hrvoje Niksic wrote:

> The other day I was surprised to learn this:
> 
> >>> nan = float('nan')
> >>> nan == nan
> False
> >>> [nan] == [nan]
> True                  # also True in tuples, dicts, etc.

Would also be surprised if you put an object in a dictionary but couldn't get 
it out?  Or added it to a list but its count was zero?

Identity-implies-equality is necessary so that classes can maintain their 
invariants and so that programmers can reason about their code.  It is not just 
in PyObject_RichCompareBool, it is deeply embedded in the language (the logic 
inside dicts for example).  It is not a short-cut, it is a way of making sure 
that internally we can count on equality relations reflexive, symmetric, and 
transitive.  A programmer needs to be able to make basic deductions such as the 
relationship between the two forms of the in-operator:   for elem in somelist:  
assert elem in somelist  # this should never fail.

What surprises me is that anyone gets surprised by anything when experimenting 
with an object that isn't equal to itself.  It is roughly in the same category 
as creating a __hash__ that has no relationship to __eq__ or making 
self-referencing sets or setting False,True=1,0 in python 2.  See 
http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/
 for a nice blog post on the subject.


Raymond



_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to