Ist sichergestellt , dass False == 0
und True == 1
in Python (unter der Annahme , dass sie nicht vom Benutzer zugewiesen werden)? Ist zum Beispiel in irgendeiner Weise garantiert, dass der folgende Code unabhängig von der Version von Python (sowohl vorhandene als auch wahrscheinlich zukünftige) immer die gleichen Ergebnisse liefert?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Jeder Verweis auf die offizielle Dokumentation wäre sehr dankbar!
Bearbeiten : Wie in vielen Antworten erwähnt, bool
erbt von int
. Die Frage kann daher wie folgt umformuliert werden: "Sagt die Dokumentation offiziell, dass sich Programmierer auf Boolesche Werte0
1
verlassen können, die von ganzen Zahlen mit den Werten und erben ?". Diese Frage ist relevant für das Schreiben von robustem Code, der aufgrund von Implementierungsdetails nicht fehlschlägt!
quelle
sum(bool_list)
. Sonst müsstest du schreibensum(1 for x bool_list if x)
.bool_list.count(True)
ist expliziter; es ist auch ungefähr 3 mal schneller… :)Antworten:
In Python 2.x ist dies nicht garantiert, da eine Neuzuweisung möglich
True
und möglich istFalse
. Selbst wenn dies passiert, werden boolean True und boolean False für Vergleiche immer noch ordnungsgemäß zurückgegeben.In Python 3.x
True
undFalse
sind Schlüsselwörter und werden immer gleich1
und sein0
.Unter normalen Umständen in Python 2 und immer in Python 3:
False
Objekt ist vom Typ,bool
der eine Unterklasse vonint
:Dies ist der einzige Grund, warum in Ihrem Beispiel
['zero', 'one'][False]
funktioniert. Es würde nicht mit einem Objekt funktionieren, das keine Unterklasse von Ganzzahlen ist, da die Listenindizierung nur mit Ganzzahlen oder Objekten funktioniert, die eine__index__
Methode definieren (danke mark-dickinson ).Bearbeiten:
Dies gilt sowohl für die aktuelle Python-Version als auch für Python 3. In den Dokumenten für Python 2.6 und den Dokumenten für Python 3 heißt es beide:
und im booleschen Unterabschnitt:
Es gibt auch für Python 2 :
Daher werden Boolesche Werte in Python 2.6 und 3 explizit als Ganzzahlen betrachtet.
Sie sind also sicher, bis Python 4 verfügbar ist. ;-);
quelle
__index__
Methode bereitstellt , kann als Listenindex verwendet werden. nicht nur Unterklassen vonint
oderlong
.a = True; True = 'i am an idiot'; a == True
=> Falsch. Abgesehen von einer solchen Neuzuweisung sind die Standardwerte als 0 und 1 standardisiert, und ich glaube, es ist gängige Praxis, davon abzuhängen. zB um in ein Array mit zwei Elementen zu indizieren, wobei [0] den falschen Fall enthält, [1] wahr.Link zum PEP, in dem der neue Bool-Typ in Python 2.3 erläutert wird: http://www.python.org/dev/peps/pep-0285/ .
Beim Konvertieren eines Bools in ein Int ist der ganzzahlige Wert immer 0 oder 1, aber beim Konvertieren eines int in ein Bool ist der boolesche Wert für alle Ganzzahlen außer 0 True.
quelle
In Python 2.x ist dies überhaupt nicht garantiert:
Es könnte sich also ändern. In Python 3.x sind True, False und None reservierte Wörter , sodass der obige Code nicht funktioniert.
Im Allgemeinen sollten Sie bei Booleschen Werten davon ausgehen, dass False zwar immer einen ganzzahligen Wert von 0 hat (solange Sie ihn nicht wie oben ändern), True jedoch einen anderen Wert haben kann. Ich würde mich nicht unbedingt auf eine Garantie verlassen
True==1
, aber auf Python 3.x wird dies immer der Fall sein, egal was passiert.quelle
Sehr einfach. Da sich Bool auf die Auswertung einer Ganzzahl als Bool bezieht, gibt NUR Null eine falsche Antwort. ALLE Nicht-Null-Werte, Gleitkommazahlen, Ganzzahlen, einschließlich negativer Zahlen oder was Sie haben, geben true zurück.
Ein gutes Beispiel dafür, warum dies nützlich ist, ist die Bestimmung des Stromversorgungsstatus eines Geräts. Ein ist ein Wert ungleich Null, Aus ist Null. Elektronisch gesehen macht dies Sinn.
Um relativ zwischen den Werten wahr oder falsch zu bestimmen, müssen Sie etwas haben, mit dem Sie es vergleichen können. Dies gilt für Strings und Zahlenwerte, mit
==
oder!=
oder<
,>
>=
,<=
usw.Sie können einer Variablen eine Ganzzahl zuweisen und dann basierend auf diesem Variablenwert true oder false erhalten.
quelle
Schreiben
int(False)
Sie einfach und Sie erhalten0
, wenn Sie eingebenint(True)
, wird es ausgegeben1
quelle
int()
mit einer einfachen numerischen Bedeutung sind, nicht dass sie genau mit 0 und 1 identisch sind.Falsch ist ein Trottel. Es hat einen anderen Typ. Es ist ein anderes Objekt als 0, das eine Ganzzahl ist.
0 == False
Gibt True zurück, da False in eine Ganzzahl umgewandelt wird. int (False) gibt 0 zurückIn der Python-Dokumentation des Operators == heißt es (help ('==')):
Infolgedessen wird False für den Vergleich in eine Ganzzahl konvertiert. Aber es ist anders als 0.
quelle
bool
ist eine Unterklasse vonint
, so in einem sehr realen Sinne ein Bool ist eine ganze Zahl. Gibt beispielsweiseisinstance(True, int)
True zurück. Und die Gleichheitsprüfung konvertiert den Bool nicht in ein int, da keine Konvertierung erforderlich ist: Sie ruft einfachint.__cmp__
direkt auf. Beachten Sie, dassbool.__cmp__ is int.__cmp__
auch ausgewertet wirdTrue
.isinstance(True, int)
=> Richtig. Das heißt, True IS ist eine Ganzzahl und erfordert keine Konvertierung.while response is False
funktioniert zurückgab , undwhile response == False
tat es nicht. Danke!0 is False
ist falsch, sagt dir nichts. Geben Sie in Ihrem interaktiven Interpreterx = -10
danny = -10
, dannx is y
und das ein auch falsch. Nur weil es Optimierungen an Ort und Stelle , wo die Python - Interpreter wieder verwendet die gleichen ganzzahligen Objekte unter bestimmten Umständen (Ganzzahlliterale als Konstanten zu speichern, kleine ganze Zahlen Internierung) bedeutet nicht , dassis
verwendet werden soll , wenn Sie testen wollen für Integer - Wert Gleichheit.