2016-05-10 13 views

Antwort

24

Hauptsächlich, weil Tupel unveränderlich sind. Nehmen wir folgende Arbeiten:

>>> l = [1, 2, 3] 
>>> t = (1, 2, 3) 
>>> x = {l: 'a list', t: 'a tuple'} 

Nun, was passiert, wenn Sie l.append(4) tun? Sie haben den Schlüssel in Ihrem Wörterbuch geändert! Von weit weg! Wenn Sie wissen, wie Hashing-Algorithmen funktionieren, sollte Ihnen das Angst machen. Tupel andererseits sind absolut unveränderlich. t += (1,) könnte so aussehen, als würde es das Tupel verändern, aber es ist wirklich nicht: Es erzeugt einfach ein neues Tupel, wobei der Schlüssel Ihres Wörterbuchs unverändert bleibt.

+0

val, große Erklärung Was machen Sie hier versucht zu sagen:.!? Aus der Ferne glauben Sie, die Frage war, damit schlecht, um einen Downvote zu bekommen? – gsamaras

+0

Ich meine, dass Sie den Schlüssel Ihres Wörterbuchs von außerhalb des Wörterbuchs geändert haben: da hashtables sich auf die 1: 1 (ish) Übereinstimmung von Schlüsseln und Hashes verlassen, ist das Ändern des Schlüssels hinter dem Hash der Rückseite eine sehr schlechte Idee. – val

+2

Sie haben nicht wirklich gesagt, warum das Ändern eines Schlüssels schlecht ist - weil es den Hashwert des Schlüssels ändert, was bedeutet, dass der Ort, an dem das Schlüssel/Wert-Paar gespeichert wird, ungültig wird, was bedeutet, dass Sie das Schlüssel/Wert-Paar nicht abrufen können nicht mehr. Hash-Tabellen arbeiten auch mit einem ∞: 1-Schlüssel für die Hash-Korrespondenz (alle Schlüssel haben den gleichen Hash-Wert). Alles, was bewirkt wird, ist ihre Leistung. – Dunes

3

Da eine Liste ist wandelbar, wenn Sie es ändern Sie würde seinen Hash ändern, die Ruinen der Point of Hazard (wie in einem Set oder einem Diktatschlüssel).

3

Weil Listen veränderbar sind und Tupel nicht.

7

Sie könnten diese Arbeit völlig machen, aber ich wette, Sie würden die Effekte nicht mögen.

from functools import reduce 
from operator import xor 

class List(list): 
    def __hash__(self): 
     return reduce(xor, self) 

Nun wollen wir sehen, was passiert:

>>> l = List([23,42,99]) 
>>> hash(l) 
94 
>>> d = {l: "Hello"} 
>>> d[l] 
'Hello' 
>>> l.append(7) 
>>> d 
{[23, 42, 99, 7]: 'Hello'} 
>>> l 
[23, 42, 99, 7] 
>>> d[l] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: [23, 42, 99, 7] 

edit: Also dachte ich, das über ein paar mehr. Sie könnten das obige Beispiel funktioniert, wenn Sie die Liste der ID als Hash-Wert zurückgeben:

class List(list): 
    def __hash__(self): 
     return id(self) 

In diesem Fall d[l] geben Ihnen 'Hello', aber weder d[[23,42,99,7]] noch d[List([23,42,99,7])] wird (weil Sie einen neuen sind die Schaffung . [Ll]ist

0

Nicht jedes Tupel hashable.For Beispiel Tupel Liste als Element enthält

x = (1,[2,3]) 
print(type(x)) 
print(hash(x))