¿Está garantizado eso False == 0y 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, boolhereda 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 0y1 ?". ¡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
Truey seFalsepuede reasignar. Sin embargo, incluso si esto sucede, boolean True y boolean False aún se devuelven correctamente para las comparaciones.En Python 3.x
TrueyFalseson palabras clave y siempre será igual a1e0.En circunstancias normales en Python 2, y siempre en Python 3:
Falseobjeto es de tipoboolque 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 deintolong.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á1fuente
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 == Falsedevuelve 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
booles 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 Falsetrabajado, ywhile response == Falseno ... ¡Gracias!0 is Falsees falso no te dice nada. En su intérprete interactivo, ingresex = -10, luegoy = -10, luegox is yy 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 queisdeba usarse cuando desee probar la igualdad del valor entero .