objects as mutable dictionary keys
John Roth
newsgroups at jhrothjr.com
Mon Dec 27 18:26:48 EST 2004
"Peter Maas" <peter at somewhere.com> wrote in message
news:33bdosF3qm2j6U1 at individual.net...
> There was a huge and sometimes heated debate about tuples, lists and
> dictionaries recently, and the mainstream opinion was that dictionary
> keys must not be mutable, so lists are not allowed as dictionary keys.
>
> BUT: objects are allowed as dictionary keys, aren't they? See the
> interpreter session below:
...
>
> This strikes me because if one can do this with instances of user
> defined classes why not with lists? Trying to use lists as dict
> keys yields "TypeError: list objects are unhashable". So why are
> list objects unhashable and user defined objects hashable? For
> user defined objects hash(x1) = id(x1), why not do the same
> with lists?
>
> I think it's because of the existence of list literals. If you
> would use id() as a hash function for lists how should d[[1,2,3]]
> be stored? For instances of user defined classes there is no
> literal and accordingly no problem to use id() as a hash function
> and instances as dictionary keys.
>
> Is that correct?
No. The basic answer is that it's up to the object whether
it will allow itself to be used as a dictionary key. In other
words, if the designer of an object thinks it makes sense
for instances to be dictionary keys, then he can supply a
__hash__() method. If he doesn't, then he doesn't supply
such a method, and it won't work.
Each class gets to make its own decision. If a class
has a __hash__() method defined, then it can be
used as a dictionary key. If it doesn't, then it can't.
There are no other constraints on the class designer;
in particular, global logical considerations simply don't
apply. It's the designer's whim, and nothing more.
The designers of the list object decided not to allow it
to be used as a dictionary key. That was their choice,
and I pretty much agree with it.
John Roth
>
> --
> -------------------------------------------------------------------
> Peter Maas, M+R Infosysteme, D-52070 Aachen, Tel +49-241-93878-0
> E-mail 'cGV0ZXIubWFhc0BtcGx1c3IuZGU=\n'.decode('base64')
> -------------------------------------------------------------------
More information about the Python-list
mailing list