2015-06-15 9 views
7

In IPython 3 interaktiv Shell:Python gesetzt interpetation von 1 und True

In [53]: set2 = {1, 2, True, "hello"} 

In [54]: len(set2) 
Out[54]: 3 

In [55]: set2 
Out[55]: {'hello', True, 2} 

Ist das, weil 1 und True die gleiche interpetation erhalten so gegeben, dass Satz Duplikate eliminiert, nur einen von ihnen (True) wird bleiben ? Wie können wir beide behalten?

+2

Verwenden Sie kein Set. Versuche '1 + Wahr'. Sie sind die gleiche Sache, also versuchen Sie nicht, sie zu trennen – JBernardo

+0

Warum müssen Sie sowohl '1' und 'True' behalten? Der einzige Unterschied ist der Typ. In allen anderen Aspekten sind sie austauschbar, soweit ich weiß. – TigerhawkT3

+0

Oder Sie können Ihre Zahlen im String-Format und Typcast halten, wenn Sie sie brauchen. –

Antwort

7

Ein Set ist eine Sammlung von hashables. Auch wenn die Anweisung 1 is True False ist, ist die Anweisung 1 == True True. Dieser Grund, sie haben den gleichen Hash-Wert und können nicht separat in einem Satz vorhanden ist, und Sie nicht, sie beide in einem Satz

EDIT es explizit machen halten können, wie jme darauf hingewiesen, es liegt daran, dass BEIDE Dinge sind wahr - sie sind gleich (per __eq__) UND sie haben die gleiche hash value (per __hash__).

In einer perfekten Welt hätten gleiche Objekte auch den gleichen Hash-Wert und dies gilt glücklicherweise für integrierte Typen.

+5

Eine Klarstellung: Zwei Items mit dem gleichen Hashwert * können * im selben Set erscheinen. Sie müssen jedoch ungleich sein. – jme

Verwandte Themen