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 -- http://mail.python.org/mailman/listinfo/python-list