Why are tuples immutable?
Antoon Pardon
apardon at forel.vub.ac.be
Tue Dec 21 05:45:44 EST 2004
Op 2004-12-18, Nick Coghlan schreef <ncoghlan at iinet.net.au>:
> Jp Calderone wrote:
>> On Fri, 17 Dec 2004 11:21:25 -0800, Jeff Shannon <jeff at ccvcorp.com> wrote:
>>
>> The correct characterization is that Python makes user-defined
>> mutable classes hashable (arguably correctly so) as the default
>> behavior.
>
> However, that is only achieved by using identity based equality by default. If
> you inherit from something which *doesn't* use identity based equality (say,
> list or dict), then the hashability isn't there. So while you're quite correct,
> it doesn't affect the OP's original complaint (not being allowed to use a list
> as a dictionary key).
>
> The Python docs are pretty precise about what the rules are:
>
> "__hash__(self)
> Called for the key object for dictionary operations, and by the built-in
> function hash(). Should return a 32-bit integer usable as a hash value for
> dictionary operations. The only required property is that objects which compare
> equal have the same hash value; it is advised to somehow mix together (e.g.,
> using exclusive or) the hash values for the components of the object that also
> play a part in comparison of objects. If a class does not define a __cmp__()
> method it should not define a __hash__() operation either; if it defines
> __cmp__() or __eq__() but not __hash__(), its instances will not be usable as
> dictionary keys. If a class defines mutable objects and implements a __cmp__()
> or __eq__() method, it should not implement __hash__(), since the dictionary
> implementation requires that a key's hash value is immutable (if the object's
> hash value changes, it will be in the wrong hash bucket)."
>
> (from: http://www.python.org/dev/doc/devel/ref/customization.html)
>
>
> The key points are:
> 1. Objects which compare equal must have the same hash value
> 2. An object's hash value must never change during it's lifetime
>
> Lists could achieve the former, but not the latter. Tuples can achieve both, by
> virtue of being immutable, with immutable contents. Ditto for sets & frozensets.
Yes they can. If you don't mutate a list it will never change during
it's lifetime.
--
Antoon Pardon
More information about the Python-list
mailing list