¿Está garantizado eso False == 0
y True == 1
, en Python (suponiendo que no sean reasignados por el usuario)? Por ejemplo, ¿se garantiza de alguna manera que el siguiente código siempre producirá los mismos resultados, cualquiera que sea la versión de Python (tanto existentes como futuros)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
¡Cualquier referencia a la documentación oficial sería muy apreciada!
Editar : como se señala en muchas respuestas, bool
hereda de int
. Por lo tanto, la pregunta puede reformularse como: "¿La documentación dice oficialmente que los programadores pueden confiar en los booleanos que heredan de enteros, con los valores 0
y1
?". ¡Esta pregunta es relevante para escribir código robusto que no fallará debido a los detalles de implementación!
python
boolean
equality
language-specifications
Eric O Lebigot
fuente
fuente
sum(bool_list)
. De lo contrario, tendrías que escribirsum(1 for x bool_list if x)
.bool_list.count(True)
es más explícito; también es aproximadamente 3 veces más rápido ... :)Respuestas:
En Python 2.x esto no está garantizado, ya que es posible
True
y seFalse
puede reasignar. Sin embargo, incluso si esto sucede, boolean True y boolean False aún se devuelven correctamente para las comparaciones.En Python 3.x
True
yFalse
son palabras clave y siempre será igual a1
e0
.En circunstancias normales en Python 2, y siempre en Python 3:
False
objeto es de tipobool
que es una subclase deint
:Es la única razón por la cual, en su ejemplo,
['zero', 'one'][False]
funciona. No funcionaría con un objeto que no sea una subclase de entero, porque la indexación de listas solo funciona con enteros u objetos que definen un__index__
método (gracias mark-dickinson ).Editar:
Es cierto de la versión actual de Python, y de la de Python 3. Los documentos para Python 2.6 y los documentos para Python 3 dicen:
y en la subsección booleana:
También hay, para Python 2 :
Por lo tanto, los booleanos se consideran explícitamente como enteros en Python 2.6 y 3.
Así que estás a salvo hasta que aparezca Python 4. ;-)
fuente
__index__
método puede usarse como un índice de lista; no solo subclases deint
olong
.a = True; True = 'i am an idiot'; a == True
=> Falso. Aparte de dicha reasignación, los valores predeterminados están estandarizados como 0 y 1, y creo que es una práctica común depender de eso; por ejemplo, para indexar en una matriz de dos elementos, donde [0] contiene el caso falso, [1] verdadero.Enlace al PEP sobre el nuevo tipo de bool en Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
Al convertir un bool en un int, el valor entero siempre es 0 o 1, pero al convertir un int en un bool, el valor booleano es True para todos los enteros excepto 0.
fuente
En Python 2.x, no está garantizado en absoluto:
Entonces podría cambiar. En Python 3.x, Verdadero, Falso y Ninguno son palabras reservadas , por lo que el código anterior no funcionaría.
En general, con booleanos debe suponer que mientras False siempre tendrá un valor entero de 0 (siempre y cuando no lo cambie, como se indicó anteriormente), True podría tener cualquier otro valor. No necesariamente confiaría en ninguna garantía de eso
True==1
, pero en Python 3.x, este siempre será el caso, pase lo que pase.fuente
Muy simple. Como bool se relaciona con la evaluación de un entero como bool, SOLO cero da una respuesta falsa. TODOS los valores distintos de cero, flotantes, enteros, incluidos los números negativos, o lo que tenga, devolverán verdadero.
Un buen ejemplo de por qué esto es útil es determinar el estado de alimentación de un dispositivo. Encendido es cualquier valor distinto de cero, apagado es cero. Hablando electrónicamente esto tiene sentido.
Para determinar verdadero o falso relativamente entre valores, debe tener algo con lo que compararlo. Esto se aplica a cadenas y valores numéricos, utilizando
==
o!=
o<
,>
>=
,<=
, etc.Puede asignar un número entero a una variable y luego obtener verdadero o falso según el valor de esa variable.
fuente
Simplemente escriba
int(False)
y obtendrá0
, si escribeint(True)
, generará1
fuente
int()
, con un significado numérico simple, no que son exactamente idénticos a 0 y 1.Falso es un bool. Tiene un tipo diferente. Es un objeto diferente de 0 que es un entero.
0 == False
devuelve True porque False se convierte en un entero. int (Falso) devuelve 0La documentación de Python del operador == dice (ayuda ('==')):
Como consecuencia, False se convierte en un entero por la necesidad de la comparación. Pero es diferente de 0.
fuente
bool
es una subclase deint
, por lo que, en un sentido muy real, un bool es un número entero. Por ejemplo,isinstance(True, int)
devuelve True. Y la verificación de igualdad no convierte el bool en un int, ya que no es necesaria la conversión: simplemente llamaint.__cmp__
directamente. Tenga en cuenta quebool.__cmp__ is int.__cmp__
también evalúa aTrue
.isinstance(True, int)
=> Verdadero. Es decir, True ES un número entero y no requiere conversión.while response is False
trabajado, ywhile response == False
no ... ¡Gracias!0 is False
es falso no te dice nada. En su intérprete interactivo, ingresex = -10
, luegoy = -10
, luegox is y
y eso también será falso. El hecho de que existan optimizaciones en el lugar donde el intérprete de Python reutiliza los mismos objetos enteros en ciertas circunstancias (almacenar literales enteros como constantes, internos enteros pequeños) no significa queis
deba usarse cuando desee probar la igualdad del valor entero .