Es Falso y Verdadero == 0 == 1 en Python un detalle de implementación o está garantizada por el lenguaje?

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

Pregunta

¿Está garantizado que False == 0 y True == 1, en Python (suponiendo que no son reasignados por el usuario)? Por ejemplo, es de ninguna manera garantiza que el siguiente código producirá siempre el mismo resultado, sea cual sea la versión de Python (tanto existentes como, probablemente, los futuros)?

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

Las referencias a la documentación oficial sería muy apreciada!

Editar : Como se ha señalado en muchas respuestas, hereda bool de int. Por lo tanto, la pregunta puede ser reformulada como: "¿La documentación oficial dice que los programadores pueden confiar en booleanos que heredan de números enteros, con los valores 0 y 1 ?". Esta pregunta es relevante para escribir código robusto que no va a fallar debido a detalles de implementación!

¿Fue útil?

Solución

En Python 2.x esto es no garantizada, ya que es posible que True y False a ser reasignados. Sin embargo, incluso si esto sucede, booleano Verdadero Falso y booleanos se volvió aún adecuadamente para las comparaciones.

En Python 3.x True y False palabras clave son y serán siempre iguales a 1 y 0.

En circunstancias normales en Python 2, y siempre en Python 3:

objeto False es de tipo bool que es una subclase de int:

object
   |
 int
   |
 bool

Es la única razón por la cual en su ejemplo, ['zero', 'one'][False] funciona. No funcionaría con un objeto que no es una subclase de número entero, porque la lista de indexación sólo funciona con números enteros, o los objetos que definen un __index__ método (gracias marca-Dickinson ).

Editar:

Es cierto de la versión actual pitón, y de la de Python 3. La docs para pitón 2,6 y la documentación para Python 3 tanto por ejemplo:

Hay dos tipos de números enteros: [...] Los enteros (int) [...] booleanos (bool)

y en la subsección boolean:

Los booleanos: representan los valores de verdad falso y verdadero [...] valores booleanos se comportan como los valores 0 y 1, respectivamente, en casi todos los contextos, siendo la excepción de que cuando se convierte en una cadena, las cadenas de "falso" o "verdadero" se devuelven, respectivamente.

También hay, para Python 2 :

En contextos numéricos (por ejemplo cuando se utiliza como el argumento para un operador aritmético), se comportan [falso y verdadero] como los números enteros 0 y 1, respectivamente.

Así booleanos se consideran explícitamente como enteros en Python 2.6 y 3.

Así que estás a salvo hasta Python 4 se presente. ; -)

Otros consejos

Enlace a la PEP discutir el nuevo tipo bool en Python 2.3: http: // www.python.org/dev/peps/pep-0285/ .

Cuando se convierte un bool a un int, el valor entero es siempre 0 o 1, pero al convertir un int a un bool, el valor booleano es cierto para todos los números enteros excepto 0.

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

En Python 2.x, no se garantiza en absoluto:

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

Por lo que podría cambiar. En Python 3.x, True, False, y ninguno es palabras reservadas, por lo que el código anterior no funcionaría.

En general, con valores booleanos se debe asumir que mientras Falso siempre tendrá un valor entero de 0 (siempre y cuando no lo cambia, como el anterior), True podría tener cualquier otro valor. Que no necesariamente depender de ninguna garantía de que True==1, pero en Python 3.x, esto siempre será el caso, no importa qué.

Muy simple. Como bool se refiere a la evaluación de un número entero como un bool, SOLAMENTE cero da una respuesta falsa. Todos los valores distintos de cero, flotadores, enteros, incluyendo los números negativos, o lo que sea, volverán realidad.

Un buen ejemplo de por qué esto es útil es la determinación del estado de la alimentación de un dispositivo. En algún valor que no sea cero, es cero fuera. Electrónicamente hablando, esto tiene sentido.

Para determinar la verdadera o falsa relativamente entre los valores, debe tener algo que compararlo. Esto se aplica a cadenas y valores numéricos, utilizando == o != o <, > >=, <=, etc.

Puede asignar un entero a una variable y luego verdadero o falso sobre la base de que el valor de la variable.

Sólo int(False) escritura y obtendrá 0, si escribe int(True) es la salida 1

Falso es un bool. Tiene un tipo diferente. Es un objeto diferente de 0, que es un número entero.

0 == False devuelve True False porque se echa a un entero. int (false) devuelve 0

La documentación pitón del operador == dice (ayuda ( '==')):

La operadores <, >, ==, >=, <= y != comparar los valores de dos objetos. Los objetos no tienen que tener el mismo tipo. Si ambos son números, que se convierten a un tipo común.

como un falso consecuencia se convierte en un número entero para la necesidad de la comparación. Sin embargo, es diferente de 0.

>>> 0 is False
False
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top