Ist Falsch == 0 True == 1 in Python eine Detail-Implementierung oder wird sie von der Sprache gewährleistet?

StackOverflow https://stackoverflow.com/questions/2764017

Frage

Ist es, dass False == 0 und True == 1 garantiert, in Python (unter der Annahme, dass sie nicht vom Benutzer zugewiesen werden)? Zum Beispiel ist es in keiner Weise garantiert, dass der folgende Code immer die gleichen Ergebnisse produzieren, was auch immer die Version von Python (sowohl bestehende als auch, wahrscheinlich, Zukunft sind)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

Jede Bezugnahme auf die offizielle Dokumentation wäre sehr willkommen!

Bearbeiten : Wie bereits erwähnt in vielen Antworten, bool erbt von int. Die Frage kann daher als neu gefasst werden: „Ist die Dokumentation offiziell sagen, dass Programmierer auf booleans verlassen können aus ganzen Zahlen vererben, mit den Werten 0 und 1 ?“. Diese Frage ist relevant für die robusten Code zu schreiben, der wegen Implementierungsdetails werden nicht versagen!

War es hilfreich?

Lösung

In Python 2.x ist die nicht garantiert, da es möglich ist, für True und False neu zugewiesen werden. Doch selbst wenn dies der Fall ist, boolean Wahr und Falsch boolean sind nach wie vor richtig zurück für Vergleiche.

In Python 3.x True und False sind Schlüsselwörter und wird immer gleich sein 1 und 0.

Unter normalen Umständen in Python 2 und immer in Python 3:

False Objekt ist vom Typ bool, die eine Unterklasse von int ist:

object
   |
 int
   |
 bool

Es ist der einzige Grund, warum in Ihrem Beispiel ['zero', 'one'][False] funktionierts. Es wäre nicht Arbeit mit einem Objekt, das nicht eine Unterklasse von integer ist, weil die Liste Indizierung funktioniert nur mit ganzen Zahlen oder Objekten, die ein __index__ Methode (dank mark-dickinson ).

Edit:

Es ist wahr, der aktuellen Python-Version, und dass der Python 3. Die Dokumentation für python 2.6 und die Dokumentation für Python 3 beide sagen:

Es gibt zwei Arten von ganzen Zahlen: [...] Ganz Zahlen (int) [...] Boolesche Werte (bool)

und im boolean Abschnitt:

Boolesche Werte: Diese stellen die Wahrheitswerte wahr und falsch [...] Boolesche Werte verhalten sich wie die Werte 0 und 1 jeweils in fast allen Kontexten, mit der Ausnahme, dass, wenn in einen String umgewandelt, die Strings „False“ oder "True" zurückgegeben wird.

Es gibt auch für Python 2 :

In numerischen Kontexten (zB wenn als Argument für einen arithmetischen Operator verwendet wird), sie [False und True] verhalten sich wie die ganzen Zahlen 0 und 1.

So booleans explizit betrachtet als ganze Zahlen in Python 2.6 und 3.

Sie sind also sicher, bis Python 4 kommt. ; -)

Andere Tipps

Link zur PEP Diskussion über den neuen Bool Typs in Python 2.3: http: // www.python.org/dev/peps/pep-0285/ .

Wenn Sie eine Bool in einem int Umwandlung der ganzzahlige Wert ist immer 0 oder 1, aber wenn ein int zu einem bool Umwandlung ist der Wahrheitswert TRUE für alle ganzen Zahlen außer 0.

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

In Python 2.x ist es überhaupt nicht garantiert:

>>> False = 5
>>> 0 == False
False

So könnte es ändern. In Python 3.x, True, False und None ist reservierte Wörter , so der obige Code würde nicht funktionieren.

In der Regel mit booleans sollten Sie davon ausgehen, dass, während Falsch wird immer einen ganzzahligen Wert von 0 hat (so lange, wie Sie es nicht ändern, wie oben), True einen anderen Wert haben könnte. Ich würde nicht unbedingt verlassen sich auf jegliche Garantie, dass True==1, aber auf Python 3.x, wird dies immer der Fall sein, egal was passiert.

Sehr einfach. Als Bool betrifft eine ganze Zahl als Bool zu bewerten, gibt NUR Null eine falsche Antwort. Alle Nicht-Null-Werte, die Schwimmer, ganzen Zahlen, einschließlich negative Zahlen, oder, was Sie haben, wird true zurück.

Ein schönes Beispiel dafür, warum dies ist nützlich, um den Energiestatus eines Geräts zu bestimmen. Auf jeden Nicht-Null-Wert ist, ausgeschaltet ist Null. Elektronisch spricht dies Sinn macht.

Um zu bestimmen, wahr oder falsch relativ zwischen den Werten, müssen Sie etwas haben, um es zu vergleichen. Dies gilt für Strings und Zahlenwerte, mit == oder != oder <, > >=, <=, etc.

Sie können eine ganze Zahl einer Variablen zuweisen und dann wahr oder falsch erhalten auf der Grundlage dieser Variablenwert.

Just Schreib int(False) und Sie werden 0 erhalten, wenn Sie int(True) Typ gibt er 1

False ist ein Bool. Es hat eine andere Art. Es ist ein anderes Objekt von 0, was eine ganze Zahl ist.

0 == False gibt True zurück, weil falsch in eine ganze Zahl umgewandelt wird. int (Falsch) liefert 0

Die Python-Dokumentation des Operators == sagt (Hilfe ( '==')):

Die Betreiber <, >, ==, >=, <= und != vergleichen die Werte von zwei Objekten. Die Objekte müssen nicht den gleichen Typen. Wenn beide Zahlen sind, werden sie in einen gemeinsamen Typ umgewandelt werden.

Als Folge False für die Notwendigkeit des Vergleichs in eine ganze Zahl umgewandelt. Aber es ist von 0 verschieden.

>>> 0 is False
False
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top