2012-04-21 19 views
9

Duplicar posible:
Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?¿Se garantiza que False "es 0" y verdadero "es 1"?

me di cuenta hoy que los siguientes trabajos usando Python 2.6 (CPython) ...

>>> a=[100,200] 
>>> a[True] 
200 
>>> a[False] 
100 

¿Este portátil para otras implementaciones de pitón (Por ejemplo, ¿está True/False garantizado para heredar de int? ¿Es True g? ¿Está garantizado evaluar a 1 en lugar de otro número distinto de cero?) ¿Hay alguna situación en la que esto sea útil? Parece que podría ser utilizado como una forma más de un operador ternario, pero no sé cuánto se gana allí ...

+6

(No es una respuesta, pero puede que le resulte interesante: en Python 2.6 y antes True y False son solo variables así que ... 'True, False =" hello "," world "' ... pero tienen la propiedad * estado reservado * en Python 3.x) –

+0

Hasta donde sé, True y False son etiquetas para 1 y 0. 1 == Verdadero y 0 == Falso. Por lo tanto, devolvería los artículos 0º y 1º en la lista –

+0

@gwynhowell: no, 'True' y' False' son objetos por derecho propio, de tipo 'bool'. –

Respuesta

11

Es part of the language specification, por lo que cualquier aplicación Python debe poner en práctica los valores booleanos como equivalentes a los enteros.

Booleanos

Estos representan los valores de la verdad falso y verdadero. Los dos objetos que representan los valores False y True son los únicos objetos booleanos. El tipo booleano es un subtipo de enteros simples, y 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 convierte a una cadena, se devuelven las cadenas "False" o "True", respectivamente.

4

Sí - esto está garantizado - con la salvedad de que True y False pueden ser reasignados; pero eso no afecta los resultados de las operaciones booleanas. (Gracias a Ignacio para la prueba documental.) De hecho, cuando no había un operador ternario, este era uno de los métodos utilizados para emularlo. Hoy en día, si quieres un operador ternario, usa el operador ternario. Pero a veces esta construcción todavía es útil. Por ejemplo:

>>> even_odd = [[], []] 
>>> for i in range(10): 
...  even_odd[i % 2 == 1].append(i) 
... 
>>> print even_odd 
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] 

Puede hacer esto con un diccionario también. Tiene un operador equivalente ternaria ...

>>> even, odd = [], [] 
>>> for i in range(10): 
...  (even if i % 2 == 1 else odd).append(i) 
... 
>>> even, odd 
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8]) 

Pero en realidad me parece la versión de la lista de indexación más fácil de leer, por lo menos en este caso. YYMV.

+0

+1 para un gran ejemplo. – mgilson

+0

¿No es más fácil decir 'even_odd [i% 2] .append (i)'? – thebjorn

Cuestiones relacionadas