[Python-Dev] == on object tests identity in 3.x - summary
Steven D'Aprano
steve at pearwood.info
Tue Jul 8 04:32:34 CEST 2014
On Tue, Jul 08, 2014 at 01:53:06AM +0200, Andreas Maier wrote:
> Thanks to all who responded.
>
> In absence of class-specific equality test methods, the default
> implementations revert to use the identity (=address) of the object as a
> basis for the test, in both Python 2 and Python 3.
Scrub out the "= address" part. Python does not require that objects
even have an address, that is not part of the language definition. (If I
simulate a Python interpreter in my head, what is the address of the
objects?) CPython happens to use the address of objects as their
identity, but that is an implementation-specific trick, not a language
guarantee, and it is documented as such. Neither IronPython nor Jython
use the address as ID.
> In absence of specific ordering test methods, the default
> implementations revert to use the identity (=address) of the object as a
> basis for the test, in Python 2.
I don't think that is correct. This is using Python 2.7:
py> a = (1, 2)
py> b = "Hello World!"
py> id(a) < id(b)
True
py> a < b
False
And just to be sure that neither a nor b are controlling this:
py> a.__lt__(b)
NotImplemented
py> b.__gt__(a)
NotImplemented
So the identity of the instances a and b are not used for < , although
the identity of their types may be:
py> id(type(a)) < id(type(b))
False
Using the identity of the instances would be silly, since that would
mean that sorting a list of mixed types would depend on the items'
history, not their values.
> In Python 3, an exception is raised in that case.
I don't think the ordering methods are terribly relevant to the
behaviour of equals.
> The bottom line of the discussion seems to be that this behavior is
> intentional, and a lot of code depends on it.
>
> We still need to figure out how to document this. Options could be:
I'm not sure it needs to be documented other than to say that the
default object.__eq__ compares by identity. Everything else is, in my
opinion, over-thinking it.
> 1. We define that the default for the value of an object is its
> identity. That allows to describe the behavior of the equality test
> without special casing such objects, but it does not work for ordering.
Why does it need to work for ordering? Not all values define ordering
relations.
Unlike type and identity, "value" does not have a single concrete
definition, it depends on the class designer. In the case of object, the
value of an object instance is itself, i.e. its identity. I don't think
we need more than that.
--
Steven
More information about the Python-Dev
mailing list