2012-04-21 13 views
9

Mögliche Duplizieren:
Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?Ist garantiert, dass False "ist 0" und True "ist 1"?

bemerkte ich heute, dass die folgenden Arbeiten mit Python 2.6 (CPython) ...

>>> a=[100,200] 
>>> a[True] 
200 
>>> a[False] 
100 

Ist das tragbare für andere Python-Implementierungen (zB ist True/False garantiert von int zu erben? Ist True g Garantiert, um 1 anstelle einer anderen von Null verschiedenen Zahl zu bewerten?) Gibt es eine Situation, wo dies nützlich wäre? Es scheint, wie es als eine andere Form eines ternären Operator verwendet werden könnte, aber ich weiß nicht, wie viel es gewonnen ...

+6

(Keine Antwort, aber Sie können es interessant finden: In Python 2.6 und vor True und False sind nur Variablen so ... 'True, False =" Hallo "," Welt "' ... aber sie haben richtig * reserved * status in Python 3.x) –

+0

Soweit ich weiß, sind True und False Labels für 1 und 0. 1 == True und 0 == False. Daher würde es die 0. und 1. Elemente in der Liste –

+0

@ gwynhowell zurückgeben: nein, "True" und "False" sind Objekte in ihrem eigenen Recht, vom Typ 'bool'. –

Antwort

11

Es part of the language specification ist, so dass jede Python-Implementierung sollte implementieren die booleans als gleichwertig die ganzen Zahlen.

Boolesche

Diese stellen die Wahrheit Falsche und wahre Werte. Die zwei Objekte, die die Werte False und True darstellen, sind die einzigen booleschen Objekte. Der boolesche Typ ist ein Subtyp einfacher Ganzzahlen, und Boolesche Werte verhalten sich in fast allen Kontexten wie die Werte 0 und 1. Die Ausnahme ist, dass bei der Umwandlung in eine Zeichenfolge die Strings "False" bzw. "True" zurückgegeben werden.

4

Ja - dies gewährleistet ist - mit dem Vorbehalt, dass True und False neu zugeordnet werden können; Aber das hat keinen Einfluss auf die Ergebnisse boolescher Operationen. (Danke an Ignacio für den dokumentarischen Beweis.) Tatsächlich, damals, als es keinen ternären Operator gab, war dies eine der Methoden, die verwendet wurden, um es zu emulieren. Wenn Sie heute einen ternären Operator wünschen, verwenden Sie den ternären Operator. Aber manchmal ist dieses Konstrukt immer noch nützlich. Zum Beispiel:

>>> even_odd = [[], []] 
>>> for i in range(10): 
...  even_odd[i % 2 == 1].append(i) 
... 
>>> print even_odd 
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] 

Sie können dies auch mit einem Wörterbuch tun. Es hat einen ternären Operator Äquivalent ...

>>> even, odd = [], [] 
>>> for i in range(10): 
...  (even if i % 2 == 1 else odd).append(i) 
... 
>>> even, odd 
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8]) 

Aber ich finde eigentlich die Liste Indizierung Version einfacher zu lesen, zumindest in diesem Fall. YYMV.

+0

+1 für ein großartiges Beispiel. – mgilson

+0

Ist es nicht einfacher, einfach nur 'even_odd [i% 2] .append (i)' zu sagen? – thebjorn

Verwandte Themen