Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Bool and int comparison and indexing on list with boolean values

Indexing on list with boolean values works fine. Though the index should be an integer.

Following is what I tried in console:

>>> 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'>

When I tried l['0'] it printed error that int type expected in indices and that is obvious. Then, even the type of 'True' and 'False' being Bool, indexing on the list works fine and automatically converts it to int type and performs the operation.

Please explain what is going on internally. I am posting question for the first time, so please forgive me for any mistake.

like image 232
Somesh Avatar asked Oct 04 '12 06:10

Somesh


1 Answers

What's going on is that booleans actually are integers. True is 1 and False is 0. Bool is a subtype of int.

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

So it's not converting them to integers, it's just using them as integers.

(Bools are ints for historical reasons. Before a bool type existed in Python, people used the integer 0 to mean false and 1 to mean true. So when they added a bool type, they made the boolean values integers in order to maintain backward compatibility with old code that used these integer values. See for instance 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.
like image 104
BrenBarn Avatar answered Sep 27 '22 22:09

BrenBarn