В Python 2.x это , а не гарантировано, поскольку возможно переназначение True
и False
. Тем не менее, даже если это произойдет, логическое значение True и логическое значение False по-прежнему будут возвращены для сравнения.
В Python 3.x True
и False
являются ключевыми словами и всегда будут равны 1
и 0
.
В обычных условиях в Python 2 и всегда в Python 3:
False
объект имеет тип bool
, который является подклассом int
:
object
|
int
|
bool
Это единственная причина, по которой в вашем примере ['zero', 'one'][False]
работает. Он не будет работать с объектом, который не является подклассом целого числа, поскольку индексирование списка работает только с целыми числами или объектами, которые определяют метод __index__
(спасибо mark-dickinson ) .
Edit:
Это верно для текущей версии Python и для Python 3. Документы для Python 2.6 и для Python 3 оба говорят:
Существует два типа целых чисел: [...] целые числа (int) [...] логические значения (bool)
и в логическом подразделе:
Booleans: они представляют значения истинности. False и True [...] логические значения ведут себя как значения 0 и 1 соответственно, почти во всех контекстах, за исключением того, что при преобразовании в строку строки «False» или "True" возвращаются соответственно.
Существует также, для Python 2 :
В числовом контексте (например, при использовании в качестве аргумента арифметического оператора) они [False и True] ведут себя как целые числа 0 и 1 соответственно.
Таким образом, логические значения явно рассматриваются как целые числа в Python 2.6 и 3.
Так что вы в безопасности, пока не появится Python 4. ; -)