2012-10-04 4 views
13

L'indicizzazione su elenco con valori booleani funziona correttamente. Anche se l'indice dovrebbe essere un numero intero.Python Bool e confronto e indicizzazione int sull'elenco con valori booleani

seguito è quello che ho provato in consolle:

>>> l = [1,2,3,4,5,6] 
>>> 
>>> l[False] 
1 
>>> l[True] 
2 
>>> l[False + True] 
2 
>>> l[False + 2*True] 
3 
>>> 
>>> l['0'] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 
>>> type(True) 
<type 'bool'> 

Quando provai l['0'] è stampato errore int tipo previsto in indici e che è evidente. Quindi, anche il tipo di 'True' e 'False' è Bool, l'indicizzazione nell'elenco funziona correttamente e la converte automaticamente in tipo int ed esegue l'operazione.

Si prega di spiegare cosa sta succedendo internamente. Sto postando la domanda per la prima volta, quindi per favore perdonami per qualsiasi errore.

risposta

20

Che cosa sta succedendo è che i booleani in realtà sono numeri interi. True è 1 e False è 0. Bool è un sottotipo di int.

>>> isinstance(True, int) 
True 
>>> issubclass(bool, int) 
True 

Quindi non li converte in numeri interi, li utilizza solo come numeri interi.

(Bools sono interi per ragioni storiche. Prima che un tipo bool esisteva in Python, la gente ha usato il numero intero da 0 a significare falso e 1 per indicare vero. Così, quando hanno aggiunto un tipo bool, hanno fatto i valori booleani interi in ordine per mantenere la compatibilità con il vecchio codice che utilizza questi valori interi. Si veda ad esempio http://www.peterbe.com/plog/bool-is-int.)

>>> help(True) 
Help on bool object: 

class bool(int) 
| bool(x) -> bool 
| 
| Returns True when the argument x is true, False otherwise. 
| The builtins True and False are the only two instances of the class bool. 
| The class bool is a subclass of the class int, and cannot be subclassed. 
+2

+1, ho imparato qualcosa. Non sapevo che 'bool' fosse una sottoclasse di' int'. – nneonneo

+0

Anch'io ho appena letto questo post [collegamento] http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints/3175293#3175293) Grazie mille. – Somesh

2

... booleane sono un sottotipo di interi semplici.

Source.

Come potete vedere, False è 0 e True è 1.

2

Python utilizzato per mancanza di booleani, abbiamo appena utilizzato numeri interi, 0 per False e qualsiasi altro numero intero per True. Quindi, quando i booleani sono stati aggiunti al linguaggio, i valori False e True, possono essere visti come i valori interi 0 e 1 ancora dall'interprete, per facilitare la retrocompatibilità. Internamente, sono sottoclassi di int.

In altre parole, le seguenti equazioni sono vere:

>>> False == 0 
True 
>>> True == 1 
True 

e come hai scoperto:

>>> True * 3 
3 

Questo non si estende a stringhe comunque.