Nick Coghlan ncoghlan at
Tue Jan 18 07:42:21 EST 2005

Antoon Pardon wrote:
> More specific the Decimal class is mutable and usable as dict key.

It's *meant* to be immutable though. The fact that we used __slots__ instead of 
__setattr__ to implement the immutability, so you *can* overwrite the slot 
variables if you really want to is merely an artifact of the current Python 

The limited mutability bug will disappear in Python 2.5, so it's not a good 
example of a 'mutable' dict key (especially given that the only way to mutate it 
is to modify private variables directly).

And, as I've stated previously, if the issue of sane mutable keys in 
dictionaries and sets really bugs you so much - implement identity_dict and 
identity_set in C and lobby for their inclusion in the collections module.

On the more general point of "don't use mutable objects with non-identity based 
comparisons as dictionary keys", try teaching students for a while (or listen to 
those who have):

When stating useful general principles, it is never, ever worth it to get into 
the quibbly little details about exceptions to the principle. If students ask, 
admit that they exist, but point out that the exceptions are rare, and not worth 
worrying about at that point in their learning.

Only when one is aware of the reasons for a principle, can one be aware of good 
reasons not to follow it :)


Nick Coghlan   |   ncoghlan at   |   Brisbane, Australia

More information about the Python-list mailing list