Frage

I heard about the line "immutable objects are hashable", below like this,

Frozensets are immutable and always hashable.

But tuples are immutable but not hashable? Why?

War es hilfreich?

Lösung

Tuples are very much hashable if the elements inside are hashable.

>>> hashable = (1,2,4)
>>> not_hashable = ([1,2],[3,4])
>>> hash_check = {}
>>> hash_check[hashable] = True
>>> hash_check
{(1, 2, 4): True}
>>> hash_check[not_hashable] = True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> 

Andere Tipps

Even though tuples are immutable themselves, they might contain mutable objects, for example, if we could do:

person = {'name': 'John', 'surname': 'Doe'}
key = (person, True)

cache = {}
cache[key] = datetime.now()  # for example

person['surname'] = 'Smith'

cache[key]  # What is the expected result?

Not all immutable objects are hashable. Furthermore, only tuples that contain mutable objects are not hashable.

>>> t = (1, 2)
>>> hash(t)
1299869600
>>> t = ([1], [2])  
>>> hash(t)
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    hash(t)
TypeError: unhashable type: 'list'

So, the problem is the list, not the tuple.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top