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 и выполняет операцию.
Пожалуйста, объясните, что происходит внутри страны.
Я отправляю вопрос в первый раз, поэтому, пожалуйста, простите меня за любую ошибку.
Ответы
Ответ 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
Однако это не распространяется на строки.