Этому гарантируют это False == 0
и True == 1
, в Python (предполагающий, что им не повторно присваивает пользователь)? Например, всегда гарантируется, что следующий код будет всегда приводить к тем же результатам, безотносительно версии Python (и существующий и, вероятно, будущие)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Любая ссылка на официальную документацию очень ценилась бы!
Править: Как отмечено во многих ответах, bool
наследовался int
. Вопрос может поэтому быть переделан как: "Делает документацию, официально говорят, что программисты могут полагаться на булевские переменные, наследовавшиеся целым числам со значениями 0
и 1
?". Этот вопрос важен для написания устойчивого кода, который не перестанет работать из-за деталей реализации!
В Python 2.x это не гарантировано, поскольку это возможно для True
и False
подлежит переназначению. Однако даже если это произойдет, логические значения True и логические False все равно будут возвращены для сравнения.
В Python 3.x True
и False
являются ключевыми словами и всегда будут равны 1
и 0
.
Обычно в Python 2 и всегда в Python 3:
False
объект имеет тип bool
, который является подклассом int
:
object
|
int
|
bool
Это единственная причина, по которой в вашем примере ['ноль', 'один'] [Ложь]
действительно работает. Это не будет работать с объектом, который не является подклассом целого числа, потому что индексирование списка работает только с целыми числами или объектами, которые определяют метод __ index __
(спасибо mark-dickinson ).
Изменить:
Это верно как для текущей версии Python, так и для версии Python 3. В документах для Python 2.6 и для Python 3 говорится:
Есть два типа целых чисел: [...] Целые числа (int) [...] Логические (bool)
и в логическом подразделе:
Логические: Они представляют значения истинности False и True [...] Логические значения ведут себя как значения 0 и 1, соответственно, почти во всех контекстах, за исключением того, что при преобразовании в строку возвращаются строки «False» или «True» соответственно.
Существует также для Python 2 :
В числовых контекстах (например, при использовании в качестве аргумента арифметического оператора) они [False и True] ведут себя как целые числа 0 и 1 , соответственно.
Таким образом, логические значения явно рассматриваются как целые числа в Python 2.6 и 3.
Так что вы в безопасности, пока не появится Python 4. ; -)
В Python 2.x это вообще не гарантируется:
>>> False = 5
>>> 0 == False
False
Так что это может измениться. В Python 3.x True, False и None являются зарезервированными словами, поэтому приведенный выше код не будет работать.
В общем, с логическими значениями вы должны предположить, что, хотя значение False всегда будет иметь целое значение 0 (если вы не измените его, как указано выше), True может иметь любое другое значение. Я бы не обязательно полагался на какую-либо гарантию того, что True==1
, но на Python 3.x это всегда будет так, несмотря ни на что.
Ссылка на PEP, обсуждающий новый тип bool в Python 2.3: http://www.python.org/dev/peps/pep-0285/.
При преобразовании bool в int целочисленное значение всегда равно 0 или 1, а при преобразовании int в bool булево значение равно True для всех целых чисел, кроме 0.
>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
False - это bool. У него другой тип. Это объект, отличный от 0, который является целым числом.
0 == False
возвращает True, потому что False приводится к целому числу. int(False) возвращает 0
В документации python по оператору == сказано (help('==')):
Операторы
<
,>
,==
,>=
,<=
и! =
сравнивают значения двух объектов. Объекты не обязательно должны иметь одинаковый тип. Если оба объекта являются числами, они преобразуются к общему типу.
Как следствие, False для целей сравнения преобразуется в целое число. Но оно отличается от 0.
>>> 0 is False
False