2017-08-13 1 views
3

Ich bin neu bei Python und lerne gerade über Wörterbücher. Ich habe zufällige Werte und Typen in ein Wörterbuch eingegeben. Hier ist, was ich ist verwirrend:Boolesch als Schlüssel im Wörterbuch verursacht seltsame Probleme?

stuff = {True: 1234, 1: 2} 
print(stuff[True]) 
print(len(stuff)) 

Wenn Sie dieses Stück Code ausführen, der Ausgang ist:

2 
1 

Wie ist dies der Ausgang? Sollte keine Ausgabe 1234 und print(len(stuff)) Ausgabe 2 sein? Ich vermisse etwas wirklich Offensichtliches, aber kann jemand bitte erklären, was vor sich geht?

+6

'wahre == 1 '; 'bool' ist ein Subtyp von' int'. – Ryan

+0

@Ryan so interpretiert Python tatsächlich '{True: 1234, 1: 2}' als '{1: 1234, 1: 2}'? Ich denke, das erklärt das 'len' Problem. Aber warum wählt es "2" anstelle von "1234", besonders weil "1234" zuerst kommt? – parrot15

+3

Wenn Sie mehrere gleiche Schlüssel haben, ist der letzte der Schlüssel, dessen Wert verwendet wird. Und Sie können es sich als '{1: 1234, 1: 2}' vorstellen, aber es ist nicht * wirklich * das; "True" und "1" sind verschieden, vergleichen sich aber mit '==', und die Wörter der Wörterbücher werden basierend auf dieser Gleichheit verglichen. * – Ryan

Antwort

0

Obwohl Python dynamisch typisiert ist, wird es als eine schlechte Übung angesehen, heterogene Schlüsseltypen in einem Wörterbuch zu verwenden.

Lauf {True: 'a', 1: 'b', 1.0: 'c'} würde Karte tatsächlich {True: 'c'},

Dies, weil 1==1.0 und 1==True, damit sie die gleiche hash haben.

Das Endergebnis ist, dass der erste Schlüssel verwendet würde und der letzte Wert aktualisiert würde.

Wenn Sie True und 1 aus irgendeinem Grund trennen möchten, verwenden Sie ihren Typ als Schlüssel als auch (z (x, type(x)))

{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'} 
+0

Ich würde vorschlagen '(x, Typ (x))' als effektiv, aber weniger teuer als 'repr (x)' –

+0

Hinweis genommen, korrigiert meinen Code –

Verwandte Themen