2012-10-04 7 views
13

Indeksowanie na liście z wartościami logicznymi działa poprawnie. Chociaż indeks powinien być liczbą całkowitą.Python Bool i int porównania i indeksowanie na liście z wartościami logicznymi

obserwuję to, co starałem się w konsoli:

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

Kiedy próbowałem l['0'] to wydrukowane błąd, który typu int oczekiwać w indeksach i to jest oczywiste. Następnie, nawet typ 'True' i 'False' jest Bool, indeksowanie na liście działa poprawnie i automatycznie konwertuje ją do typu int i wykonuje operację.

Proszę wyjaśnić, co dzieje się wewnętrznie. Po raz pierwszy zamieszczam pytanie, więc proszę mi wybaczyć za każdy błąd.

Odpowiedz

20

Co się dzieje, że booleans faktycznie są liczbami całkowitymi. Prawda to 1, a Fałsz to 0. Bool to podtyp int.

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

Więc to nie konwertuje ich na liczby całkowite, tylko używa ich jako liczb całkowitych.

(Booly są typu int z powodów historycznych Zanim istniał typ boolowy w Pythonie, ludzie użyli liczby całkowitej 0 jako wartości false, a 1 do wartości true, więc gdy dodali typ bool, ustawili wartości logiczne liczb całkowitych w celu aby zachować wsteczną kompatybilność ze starego kodu, który wykorzystał te wartości całkowitych. Zobacz na przykład 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, Nauczyłem się czegoś. Nie znałem 'bool' był podklasą' int'. – nneonneo

+0

Właśnie przejrzałem ten post zbyt {link} http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints/3175293#3175293) Wielkie dzięki. – Somesh

2

... Boolean są podtypem zwykłych liczb całkowitych.

Source.

Jak widać, False jest 0 i True jest 1.

2

Python używany na brak booleans, użyliśmy właśnie liczb całkowitych, 0 dla Fałszywego i dowolnych innych liczb całkowitych dla True. Więc kiedy do języka dodano wartości logiczne, wartości Fałszywy i Prawdziwy mogą być postrzegane przez interpreter jako wartości całkowite 0 i 1, aby pomóc kompatybilności wstecznej. Wewnętrznie są one podklasami int.

Innymi słowy, następujące równania są prawdziwe:

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

i jak dowiedział się:

>>> True * 3 
3 

ta nie obejmuje jednak struny.

Powiązane problemy