object identity and hashing

George Sakkis george.sakkis at gmail.com
Sun Feb 24 22:28:43 EST 2008


On Feb 24, 9:11 pm, castiro... at gmail.com wrote:
> On Feb 24, 7:58 pm, Jeff Schwab <j... at schwabcenter.com> wrote:
>
>
>
> > castiro... at gmail.com wrote:
> > > Can someone explain this?
>
> > >>>> a= {}
>
> > Create an empty dict and bind it to the name a.
>
> > >>>> a[(3,)]= 0
>
> > Set the key/value pair (3,):0 to the dict.
>
> > >>>> (3,) in a
>
> > Is (3,) one of the keys in the dict?
>
> > > True
>
> > Yes, it is.
>
> > >>>> (3,) is (3,)
>
> > Create two separate tuples (that happen to be equivalent).  Are they the
> > same object?
>
> > > False
>
> > No, they are not.
>
> > Every time you write (3,), you are potentially creating a new object.
> > These objects have equal values (and hash codes), so they are
> > interchangeable for purposes of keying a dict.
>
> I see.  You stated,
>
> > Is (3,) one of the keys in the dict?
>
> > > True
>
> > Yes, it is.
>
> It isn't, but it does equal a key that's already in the dict.

Right, dict lookup depends on object hashing (__hash__) and equality
(__eq__), not identity. There are legitimate cases where lookup should
be based on identity [1], but they are far less common than those
based on equality.

George

[1] http://www.martinfowler.com/eaaCatalog/identityMap.html



More information about the Python-list mailing list