2014-04-24 11 views
7

So Listen sind unhashable:Was macht Listen unzerlegbar?

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

Die folgenden page gibt eine Erklärung:

Eine Liste ist ein veränderlicher Typ und als Schlüssel in einem Wörterbuch (es könnte sein kann nicht verwendet ändern - Platzieren Sie den Schlüssel nicht mehr in der internen Hash-Tabelle des Wörterbuchs.

Ich verstehe, warum es nicht wünschenswert ist, veränderbare Objekte als Wörterbuchschlüssel zu verwenden. Allerdings wirft Python die gleiche Ausnahme, auch wenn ich einfach versuche, eine Liste mit Hash (unabhängig von Wörterbucherstellung)

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

Does Python tut dies als eine Garantie dafür, dass änderbare Typen nie als Dictionary-Schlüssel verwendet werden? Oder gibt es einen anderen Grund, warum veränderbare Objekte unmöglich zu hacken sind, unabhängig davon, wie ich sie verwenden möchte?

+2

'hash()' ruft einfach die Methode '__hash__' des Objekts auf, und genau das ist es, was dicts macht. –

+1

Was * willst du mit dem Hash machen? Die Motivation ist, dass sich der Hash-Wert eines Objekts nicht ändern sollte, und gleiche Objekte sollten im Allgemeinen denselben Hashwert haben. – geoffspear

Antwort

17

Wörterbücher und Sets verwenden Hash-Algorithmen eindeutig ein Element zu bestimmen. Und diese Algorithmen verwenden die Elemente, die als Schlüssel verwendet werden, um den eindeutigen Hash-Wert zu erhalten. Da Listen änderbar sind, kann sich der Inhalt einer Liste ändern. Nachdem eine Liste in einem Wörterbuch als Schlüssel enthalten ist, ändert sich auch der Hash-Wert, wenn sich der Inhalt der Liste ändert. Wenn sich der Hashwert ändert, nachdem er an einem bestimmten Platz im Wörterbuch gespeichert wurde, führt dies zu einem inkonsistenten Wörterbuch. Zum Beispiel wäre die Liste anfangs an der Stelle A gespeichert worden, die basierend auf dem Hash-Wert bestimmt wurde. Wenn sich der Hashwert ändert und wir nach der Liste suchen, die wir möglicherweise nicht an der Position A oder gemäß dem neuen Hashwert finden, finden wir möglicherweise ein anderes Objekt.

Da es nicht möglich ist, mit einem Hash-Wert zu kommen, intern gibt es no hashing function defined for lists.

PyObject_HashNotImplemented,    /* tp_hash */ 

Da die Hash-Funktion nicht implementiert ist, wenn Sie es als Schlüssel im Wörterbuch verwenden oder versuchen, mit Gewalt den Hash-Wert mit hash Funktion zu erhalten, nicht um es Hash und so schlägt es mit unhashable Typ

TypeError: unhashable type: 'list'