Sobes.tech
Middle

Qual é a relação entre funções de hash e objetos mutáveis/imutáveis?

sobes.tech IA

Resposta da IA

Os objetos em Python dividem-se em mutáveis (mutable) e imutáveis (immutable). A relação com as funções de hash reside no facto de que apenas objetos imutáveis são hasháveis (hashable) e, consequentemente, podem ser utilizados como chaves de dicionário ou elementos de conjuntos.

  • Objetos imutáveis: string (str), tuplo (tuple), número (int, float, bool), NoneType, etc. O seu valor não pode ser alterado após a criação. O Python calcula o valor de hash para esses objetos uma única vez.
  • Objetos mutáveis: lista (list), dicionário (dict), conjunto (set), etc. O seu valor pode ser alterado após a criação. Se objetos mutáveis fossem hasháveis, o seu valor de hash poderia mudar após serem adicionados a um dicionário ou conjunto, o que quebraria o funcionamento das estruturas de dados baseadas em tabelas de hash.

A relação manifesta-se na utilização de dicionários e conjuntos:

  • Dicionários: usam uma tabela de hash para acesso rápido aos valores por chave. As chaves do dicionário devem ser hasháveis.
  • Conjuntos: também usam uma tabela de hash para armazenar elementos únicos. Os elementos do conjunto devem ser hasháveis.
# Isto funciona porque a tupla é um objeto imutável
my_dict = {(1, 2): 'olá'}
my_set = {(1, 2)}
# Isto irá gerar um erro TypeError, pois a lista é um objeto mutável
# my_dict = {[1, 2]: 'olá'}
# my_set = {[1, 2]}

# TypeError: unhashable type: 'list'