2014-04-24 18 views
7

Così liste sono nel calcolo dell'hash:Cosa rende le liste inattaccabili?

>>> { [1,2]:3 } 
TypeError: unhashable type: 'list' 

Il seguente page dà una spiegazione:

Una lista è un tipo mutabile, e non può essere utilizzato come una chiave in un dizionario (potrebbe cambiare in -place che rende la chiave non più localizzabile nella tabella di hash interna del dizionario).

Capisco perché non è desiderabile utilizzare oggetti mutabili come tasti del dizionario. Tuttavia, Python solleva la stessa eccezione anche quando sto semplicemente cercando di hash un elenco (indipendentemente dalla creazione dizionario)

>>> hash([1,2]) 
TypeError: unhashable type: 'list' 

fa Python fare questo come una garanzia che i tipi mutabili non saranno mai utilizzati come chiavi di dizionario? O c'è un'altra ragione che rende impossibile l'hash degli oggetti mutabili, indipendentemente da come prevedo di usarli?

+2

'hash()' chiama semplicemente il metodo '__hash__' dell'oggetto, e questo è esattamente ciò che fanno i dicts. –

+1

Cosa * fai * hai intenzione di fare con l'hash? La motivazione è che l'hash di un oggetto non dovrebbe cambiare, e gli oggetti uguali dovrebbero generalmente avere lo stesso hash. – geoffspear

risposta

17

Dizionari e set utilizzano algoritmi di hashing per determinare un articolo in modo univoco. E quegli algoritmi utilizzano gli elementi usati come chiavi per ottenere il valore hash univoco. Poiché le liste sono mutabili, il contenuto di una lista può cambiare. Dopo aver permesso a un elenco di essere in un dizionario come chiave, se il contenuto dell'elenco cambia, anche il valore dell'hash cambierà. Se il valore di hash cambia dopo essere stato memorizzato in un particolare slot nel dizionario, questo porterà a un dizionario incoerente. Ad esempio, inizialmente la lista sarebbe stata memorizzata nella posizione A, che è stata determinata in base al valore hash. Se il valore dell'hash cambia, e se cerchiamo l'elenco potremmo non trovarlo nella posizione A, o come per il nuovo valore di hash, potremmo trovare qualche altro oggetto.

Poiché, non è possibile ottenere un valore hash, internamente c'è no hashing function defined for lists.

PyObject_HashNotImplemented,    /* tp_hash */ 

Poiché la funzione di hashing non è implementata, quando lo si utilizza come una chiave nel dizionario, o con forza tenta di ottenere il valore hash con hash funzione, non riesce a hash e così non riesce con il tipo di calcolo dell'hash

TypeError: unhashable type: 'list' 
Problemi correlati