2016-11-09 2 views
2

Basiert auf Python2.7 Sind diese Schlüssel von dict unveränderlich und waschbar? Und innerhalb der Liste Implementierung, finde ich, dass __hash__=None, was bedeutet, dass es nicht waschbar ist.Warum sollte Python dict's Fromes-Methode eine Liste als Argument akzeptieren?

Und wir könnten fromkeys verwenden dict wie diese zu erstellen:

d={}.fromkeys(('Alice', 'Bob'),3000) 

Da Tupel ist unveränderlich und hashable.

aber ich finde das auch in Ordnung ist:

d={}.fromkeys(['Alice', 'Bob'],3000) 

Das verwirrt mich wirklich. Warum würde fromkeys eine Liste als Argument akzeptieren? Gibt es eine implizite Liste von Tupeln? Danke!

Antwort

1

Lesen Sie die Erklärung sehr sorgfältig, auf das, was Sie geschrieben haben:

Schlüssel dict

Die fromkeys Methode nimmt ein iterable unveränderlich sein muss. Aus dem Docstring:

Gibt ein neues dict mit Schlüsseln aus iterable und Werte gleich dem Wert zurück.

Sie haben zwei Beispiele dafür angegeben. Was am Ende passiert ist, dass die Elemente in diesen iterables Strings sind, die unveränderlich sind. Es sind diese Elemente, die die Schlüssel Ihres Wörterbuchs sind.

einem Ihrer Beispiele nehmen, können Sie dies deutlich sehen von der Ausgabe:

d={}.fromkeys(('Alice', 'Bob'),3000) 

Ausgang:

{'Alice': 3000, 'Bob': 3000} 

Wenn Sie dies hatte, dann würden Sie die erwartete Fehlermeldung erhalten, denken Sie sollte erhalten haben:

d={}.fromkeys((['Alice'], ['Bob']),3000) 

Traceback (most recent call last): 
    File "/Users/xxx/dev/rough/goo.py", line 31, in <module> 
    d={}.fromkeys((['Alice'], ['Bob']),3000) 
TypeError: unhashable type: 'list' 
2

fromkeys akzeptiert alle iterierbaren als ein Argument (das ist Duck-Typisierung). Es sind die Elemente des Iterablen, die hashbar sein müssen, nicht das Iterierbare selbst.

Die docstring nur sagt:

>>> print(dict.fromkeys.__doc__) 
dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v. 
v defaults to None. 

Wie Sie sehen, gibt es keine Art Anforderung an S.

Verwandte Themen