[Python-Dev] == on object tests identity in 3.x
Benjamin Peterson
benjamin at python.org
Tue Jul 8 01:49:40 CEST 2014
On Mon, Jul 7, 2014, at 16:36, Andreas Maier wrote:
> Am 2014-07-07 19:43, schrieb Ethan Furman:
> > On 07/07/2014 09:56 AM, Andreas Maier wrote:
> >> Am 07.07.2014 17:55, schrieb Ethan Furman:
> >>> On 07/07/2014 04:22 AM, Andreas Maier wrote:
> >>>>
> >>>> Where is the discrepancy between the documentation of == and its
> >>>> default implementation on object documented?
> >>>
> >>> There's seems to be no discrepancy (at least, you have not shown it),
> >>
> >> The documentation states consistently that == tests the equality of
> >> the value of an object. The default implementation
> >> of == in both 2.x and 3.x tests the object identity. Is that not a
> >> discrepancy?
> >
> > One could say that the value of an object is the object itself. Since
> > different objects are different, then they are not equal.
> >
> >>> but to answer the question about why the default equals operation is an
> >>> identity test:
> >>>
> >>> - all objects should be equal to themselves (there is only one that
> >>> isn't, and it's weird)
> >>
> >> I agree. But that is not a reason to conclude that different objects
> >> (as per their identity) should be unequal. Which is
> >> what the default implementation does.
> >
> > Python cannot know which values are important in an equality test, and
> > which are not. So it refuses to guess.
> >
> Well, one could argue that using the address of an object for its value
> equality test is pretty close to guessing, considering that given a
> sensible definition of value equality, objects of different identity can
> very well be equal but will always be considered unequal based on the
> address.
Probably the best argument for the behavior is that "x is y" should
imply "x == y", which preludes raising an exception. No such invariant
is desired for ordering, so default implementations of < and > are not
provided in Python 3.
More information about the Python-Dev
mailing list