ejemplo - ¿Es False== 0 y True== 1 en Python un detalle de implementación o está garantizado por el lenguaje?
if in python (6)
¿Se garantiza que False == 0
y True == 1
, en Python (suponiendo que no sean reasignados por el usuario)? Por ejemplo, ¿está garantizado de alguna manera que el siguiente código siempre producirá los mismos resultados, sea cual sea la versión de Python (tanto las existentes como las futuras)?
0 == False # True
1 == True # True
[''zero'', ''one''][False] # is ''zero''
Cualquier referencia a la documentación oficial sería muy apreciada!
Edición : Como se señaló en muchas respuestas, bool
hereda de int
. Por lo tanto, la pregunta se puede replantear como: "¿Dice la documentación oficialmente que los programadores pueden confiar en los booleanos heredados de enteros, con los valores 0
y 1
?". ¡Esta pregunta es relevante para escribir código sólido que no fallará debido a los detalles de la implementación!
En Python 2.x esto no está garantizado, ya que es posible que se False
a asignar True
y False
. Sin embargo, incluso si esto sucede, el verdadero booleano y el falso booleano todavía se devuelven correctamente para comparaciones.
En Python 3.x, True
y False
son palabras clave y siempre serán iguales a 1
y 0
.
En circunstancias normales en Python 2, y siempre en Python 3:
False
objeto False
es de tipo bool
que es una subclase de int
:
object
|
int
|
bool
Es la única razón por la que 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 lista solo funciona con enteros u objetos que definen un método __index__
(gracias mark-dickinson ).
Editar:
Es cierto para la versión actual de Python y la de Python 3. La documentación para Python 2.6 y la documentación para Python 3 dicen:
Hay dos tipos de enteros: [...] Enteros (int) Booleanos (bool)
y en la subsección booleana:
Booleanos: representan los valores de verdad Falso y Verdadero Los valores [...] booleanos se comportan como los valores 0 y 1, respectivamente, en casi todos los contextos, con la excepción de que cuando se convierten en una cadena, las cadenas "Falso" o "Verdadero "se devuelven, respectivamente.
Así que los booleanos se consideran explícitamente como enteros en Python 2.6 y 3.
Así que estás a salvo hasta que llegue Python 4. ;-)
En Python 2.x, no está garantizado en absoluto:
>>> False = 5
>>> 0 == False
False
Así podría cambiar. En Python 3.x, Verdadero, Falso y Ninguno son palabras reservadas , por lo que el código anterior no funcionará.
En general, con booleanos, debe asumir que si bien Falso siempre tendrá un valor entero de 0 (siempre que no lo cambie, como se indicó anteriormente), Verdadero podría tener cualquier otro valor. No necesariamente dependería de ninguna garantía de que True==1
, pero en Python 3.x, este siempre será el caso, sin importar lo que pase.
Enlace al PEP que trata sobre el nuevo tipo de bool en Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
Cuando se convierte un bool en un int, el valor entero siempre es 0 o 1, pero cuando se convierte un int en un bool, el valor booleano es True para todos los enteros excepto 0.
>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
Falso es un bool. Tiene un tipo diferente. Es un objeto diferente de 0 que es un número entero.
0 == False
devuelve True porque False se convierte en un entero. int (Falso) devuelve 0
La documentación de python del operador == dice (ayuda (''=='')):
Los operadores
<
,>
,==
,>=
,<=
y!=
Comparan los valores de dos objetos. Los objetos no necesitan tener el mismo tipo. Si ambos son números, se convierten a un tipo común.
Como consecuencia, False se convierte en un entero para la necesidad de la comparación. Pero es diferente de 0.
>>> 0 is False
False
Muy simple. Como bool se relaciona con la evaluación de un número entero como un bool, SOLAMENTE cero da una respuesta falsa. TODOS los valores que no sean cero, flotantes, enteros, incluidos los números negativos, o lo que sea, devolverán verdadero.
Un buen ejemplo de por qué esto es útil es determinar el estado de energía de un dispositivo. On es cualquier valor distinto de cero, off es cero. Hablando electrónicamente esto tiene sentido.
Para determinar el valor verdadero o falso entre los valores, debe tener algo con qué 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 basado en ese valor de variable.
Simplemente escribe int(False)
y obtendrás 0
, si escribes int(False)
int(True)
se mostrará 1