Hashable v.s. Immutable

hashable

An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() method). Hashable objects which compare equal must have the same hash value.

Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.

All of Python’s immutable built-in objects are hashable; mutable containers (such as lists or dictionaries) are not. Objects which are instances of user-defined classes are hashable by default. They all compare unequal (except with themselves), and their hash value is derived from their id().

>>> a = 1
>>> a.__hash__()
1
>>> hash(a)
1

>>> a = 1.2
>>> hash(a)
461168601842738689

>>> import collections
>>> isinstance([2,3], collections.Hashable)
False
>>> isinstance(2, collections.Hashable)
True

>>> a = {[2,3]:1}
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'

immutable

An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to be created if a different value has to be stored. They play an important role in places where a constant hash value is needed, for example as a key in a dictionary.

mutable

Mutable objects can change their value but keep their id().

  • id()

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same value.(因为内存re-use)

CPython implementation detail: This is the address of the object in memory.

你可能感兴趣的:(Hashable v.s. Immutable)