2010-03-09 16 views
8

En python, puede concatenar valores booleanos y devolvería un número entero. Ejemplo:¿Por qué la concatenación de un valor booleano devuelve un número entero?

>>> True 
True 
>>> True + True 
2 
>>> True + False 
1 
>>> True + True + True 
3 
>>> True + True + False 
2 
>>> False + False 
0 

¿Por qué? ¿Por qué esto tiene sentido?

entiendo que True se representa a menudo como 1, mientras que False se representa como 0, pero que todavía no explica cómo la adición de dos valores del mismo tipo devuelve un tipo completamente diferente.

+3

¿Cuál fue su expectativa, de todos modos? ¿Qué significa "concatenar" en el contexto de los tipos escalares? Para las operaciones lógicas, se usan 'y',' o', etc. – Ber

+0

-1: ¿Cuál es el caso de uso para esto? ¿Por qué importa esto? –

+1

Realmente no sé cuáles eran mis expectativas, pero definitivamente no esperaba que esto sucediera. –

Respuesta

21

porque en Python, bool es la subclase/subtipo de int.

>>> issubclass(bool,int) 
True 

actualización:

De boolobject.c

/* Boolean type, a subtype of int */ 

/* We need to define bool_print to override int_print */ 
bool_print 
    fputs(self->ob_ival == 0 ? "False" : "True", fp); 

/* We define bool_repr to return "False" or "True" */ 
bool_repr 
    ... 

/* We define bool_new to always return either Py_True or Py_False */ 
    ... 

// Arithmetic methods -- only so we can override &, |,^
bool_as_number 
    bool_and,  /* nb_and */ 
    bool_xor,  /* nb_xor */ 
    bool_or,  /* nb_or */ 

PyBool_Type 
    "bool", 
    sizeof(PyIntObject), 
    (printfunc)bool_print,   /* tp_print */ 
    (reprfunc)bool_repr,   /* tp_repr */ 
    &bool_as_number,    /* tp_as_number */ 
    (reprfunc)bool_repr,   /* tp_str */ 
    &PyInt_Type,     /* tp_base */ 
    bool_new,      /* tp_new */ 
+2

+1 Esta es la mejor respuesta. :) –

+0

Maravilloso. Exactamente lo que estaba buscando –

7

Reemplazar "concatenar" con "añadir" y True/False con 1/0, como usted ha dicho, y tiene todo el sentido.

En resumen verdadero y falso en una frase: son formas alternativas para deletrear el entero valores 1 y 0, con la única diferencia de que STR() y repr() devuelven las cadenas 'True' y ' False 'en lugar de' 1 'y' 0 '.

Consulte también: http://www.python.org/dev/doc/maint23/whatsnew/section-bool.html

2
True is 1 
False is 0 
+ is ADD 

Prueba esto:

IDLE 2.6.4  
>>> True == 1 
True 
>>> False == 0 
True 
>>> 
Cuestiones relacionadas