Why is dictionary.keys() a list and not a set?

Christoph Zwerschke cito at online.de
Fri Nov 25 23:26:25 CET 2005


Mike Meyer wrote:

 > The mutability - or immutability - of an object is irrelevant to
 > the question of whether or not they can be a dictionary key/set
 > element. The critical property is that they are hashable.
 > *Most* immutable builtin types are hashable, and no builtin
 > mutable types are hashable, which deserves a mention.

I think the problem we are facing is that you must distinguish between 
hashable/mutable *types* and hashable/mutable objects. You can have 
*types* like tuple which are hashable/immutable themselves, but can have 
*instances* that are mutable and not hashable, such as ([]).

For the built-in types I think objects are hashable if and only if they 
are immutable (not 100% sure, but can you give a counterexample?). 
That's why I got back to talk about mutability first. But I agree one 
should also explain the problem of non-built-in types.

Maybe one can split the explanation and talk about the built-in 
datatypes first and then explain the situation for user-defined types.

 >>>And the footnote is:
 >>>Instances of Python classes are hashable if they define a __hash__
 >>>method, or if they don't define either __cmp__ or __eq__.
 >>
 >>I think that's not exact enough. For instance, ordinary lists also
 >>define a __hash__ method but are not hashable since that method just
 >>raises an exception.
 >
 > Ordinary lists aren't Python classes.

In your first sentence, it was unclear whether "they" refered to the 
class or the instance. But anyway, what about the following class:

class mylist(list):
     pass

This class definitely has a __hash__ method. But instances of this class 
are not hashable.

-- Christoph



More information about the Python-list mailing list