[prev in list] [next in list] [prev in thread] [next in thread] 

List:       python-list
Subject:    Re: objects as mutable dictionary keys
From:       "John Roth" <newsgroups () jhrothjr ! com>
Date:       2004-12-27 23:26:48
Message-ID: 10t16i66jkjtg7a () news ! supernews ! com
[Download RAW message or body]

"Peter Maas" <peter@somewhere.com> wrote in message 
news:33bdosF3qm2j6U1@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')
> ------------------------------------------------------------------- 

-- 
http://mail.python.org/mailman/listinfo/python-list
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic