Pytanie Python Bool i int porównania i indeksowanie na liście z wartościami logicznymi


Indeksowanie na liście z wartościami boolowskimi działa dobrze. Chociaż indeks powinien być liczbą całkowitą.

Oto, co wypróbowałem 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'] wydrukował błąd, którego typ int oczekuje się w indeksach i to jest oczywiste. Wtedy nawet typ 'True' i 'False' istota Boolindeksowanie na liście działa poprawnie i automatycznie konwertuje ją na typ int i wykonuje operację.

Proszę wyjaśnić, co dzieje się wewnętrznie. Publikuję pytanie po raz pierwszy, więc proszę, wybacz mi, że popełniłem jakiś błąd.


13
2017-10-04 06:42


pochodzenie




Odpowiedzi:


Co się dzieje, to faktycznie booleans  liczby całkowite. Prawda to 1, a Fałsz to 0. Bool to podtyp int.

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

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

(Bools są typu int z przyczyn historycznych, zanim istniał typ bool w Pythonie, ludzie użyli liczby całkowitej 0, aby określić wartość false, a 1 oznacza true, więc gdy dodali typ bool, ustawili wartości logiczne liczb całkowitych w celu zachowania zgodności wstecznej ze starym kodem, który używał tych 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.

20
2017-10-04 06:46



+1, nauczyłem się czegoś. Nie wiedziałem bool była podklasą int. - nneonneo
Właśnie przejrzałem ten post [link]stackoverflow.com/questions/3174392/...) Wielkie dzięki. - Somesh


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

Źródło.

Jak widzisz, False jest 0 i True jest 1.


2
2017-10-04 06:46





Pyton używany brakować booleans, używaliśmy tylko liczb całkowitych, 0 dla False i 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, poniższe równania są prawdziwe:

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

i jak się dowiedziałeś:

>>> True * 3
3

Nie dotyczy to jednak ciągów.


2
2017-10-04 06:48