Mutable objects which define __hash__ (was Re: Why are tuples immutable?)
Nick Coghlan
ncoghlan at iinet.net.au
Thu Dec 23 01:42:59 EST 2004
Steven Bethard wrote:
> Of course, if rehash worked in place, you could probably do some
> optimizations to only rehash the necessary items.
Yep, especially given this little critter from dictobject.h which contains
everything needed to spot mutated objects:
typedef struct {
long me_hash; /* cached hash code of me_key */
PyObject *me_key;
PyObject *me_value;
} PyDictEntry;
So the major downside to giving standard mutable objects hash methods is that
dictionaries then suffer from the 'mutation without resorting' problem that
sorted lists can currently suffer from.
As I said to Antoon, I no longer have any theoretical objection to the idea of
mutable objects with a variable hash. I do, however, have a practical objection
- mutating a dict's keys without calling rehash() could lead to some extremely
subtle bugs that the interpreter can't really help identify. It just seems far
too easy to inadvertently burn yourself by altering an object that is being used
as a dictionary key.
What I'd prefer to see is a collections.id_dict (and a corresponding
collections.id_set) - identity based versions of the standard classes, useful
when classifying mutable objects. The id_dict would be handy when you want to
associate additional information with a mutable object without altering the
object (e.g. analysing a graph, and recording extra information about each of
the nodes).
For mutable objects, value-based keying doesn't really make sense (as the value
may change with time), but identity-based keying is entirely straightforward,
and including ID-based dicts and sets would go a long way to providing OOWTDI.
And the performance should leave the Python-based versions for dead. They should
actually be slightly faster than the standard dict() and set(), since they don't
have to deal with user-overridable special methods :)
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at email.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.skystorm.net
More information about the Python-list
mailing list