Подтвердить что ты не робот

Python Bool и int сравнение и индексирование в списке с булевыми значениями

Индексирование по списку с булевыми значениями отлично работает. Хотя индекс должен быть целым числом.

Вот что я пробовал в консоли:

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

Когда я попробовал l['0'], он напечатал ошибку, которую тип int ожидал в индексах, и это очевидно. Тогда даже тип 'True' и 'False' составляет Bool, индексирование в списке отлично работает и автоматически преобразует его в тип int и выполняет операцию.

Пожалуйста, объясните, что происходит внутри страны. Я отправляю вопрос в первый раз, поэтому, пожалуйста, простите меня за любую ошибку.

4b9b3361

Ответ 1

Что происходит, так это то, что булевы на самом деле являются целыми числами. True - 1, а False - 0. Bool - это подтип int.

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

Поэтому он не преобразует их в целые числа, а просто использует их как целые числа.

(Bools являются ints по историческим причинам. До того, как в Python существовал тип bool, люди использовали целое число 0 для обозначения false, а 1 - true. Поэтому, когда они добавили тип bool, они сделали целые числа логических значений, чтобы поддерживайте обратную совместимость со старым кодом, который использовал эти целые значения. См. например 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

... Булевы - это подтип простых целых чисел.

Источник.

Как видите, False - 0, а True - 1.

Ответ 3

У Python не хватало логических значений, мы просто использовали целые числа, 0 для False и любое другое целое число для True. Поэтому, когда логические элементы были добавлены в язык, значения False и True можно рассматривать как целые значения 0 и 1 все еще интерпретатором, чтобы помочь обратно совместимости. Внутренне они являются подклассами int.

Другими словами, следующие уравнения имеют значение True:

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

и, как вы узнали:

>>> True * 3
3

Однако это не распространяется на строки.