Являются ли False == 0 и True == 1 деталями реализации или это гарантируется языком?
Гарантируется ли, что False == 0
и True == 1
в Python (при условии, что они не переназначены пользователем)? Например, гарантируется ли каким-либо образом, что следующий код всегда будет давать одинаковые результаты, независимо от версии Python (как существующей, так и, вероятно, будущей)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Любая ссылка на официальную документацию была бы весьма признательна!
Как отмечалось во многих ответах, bool
наследуется от int
. Поэтому вопрос можно сформулировать следующим образом: "Официально ли в документации говорится, что программисты могут полагаться на логические значения, наследуемые от целых чисел, со значениями 0
и 1
?". Этот вопрос актуален для написания надежного кода, который не даст сбоя из-за деталей реализации!
Переведено автоматически
Ответ 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
Это единственная причина, по которой в вашем примере ['zero', 'one'][False]
действительно работает. Это не будет работать с объектом, который не является подклассом integer , потому что индексирование списков работает только с целыми числами или объектами, которые определяют __index__
метод (спасибо Марку-дикинсону).
Редактировать:
Это верно для текущей версии python и для версии Python 3. В документах для python 2 и в документах для Python 3 говорится:
Существует два типа целых чисел: [...] Integers (int) [...] Booleans (bool)
и в подразделе boolean:
Логические значения: они представляют истинностные значения False и True [...] Логические значения ведут себя как значения 0 и 1 соответственно почти во всех контекстах, за исключением того, что при преобразовании в строку возвращаются строки "False" или "True" соответственно.
Также есть, для Python 2:
В числовых контекстах (например, при использовании в качестве аргумента арифметического оператора) они [False и True] ведут себя как целые числа 0 и 1 соответственно.
Таким образом, логические значения явно рассматриваются как целые числа в Python 2 и 3.
Таким образом, вы в безопасности, пока не появится Python 4. ;-)
Ответ 2
Вот пример обсуждения нового типа 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
Ответ 3
В Python 2.x это вообще не гарантируется:
>>> False = 5
>>> 0 == False
False
Так что это может измениться. В Python 3.x True, False и None являются зарезервированными словами, поэтому приведенный выше код не будет работать.
В общем случае с логическими значениями вы должны предположить, что в то время как False всегда будет иметь целочисленное значение 0 (до тех пор, пока вы не измените его, как указано выше), True может иметь любое другое значение. Я бы не стал обязательно полагаться на какие-либо гарантии этого True==1
, но на Python 3.x это всегда будет так, несмотря ни на что.
Ответ 4
Давайте разберем этот вопрос на две части.
Python:
print(45 == "45") # Output - False
Javascript:
console.log(45 == "45") # Output - true
Здесь большинство людей думают, что Javascript проверяет только значение обоих побочных объектов, но это неправда, написание console.log(45 == "45")
похоже на print(45 == "45")
.
Но теперь у вас возник вопрос, если оба синтаксиса похожи, почему я получаю разные результаты?
В Javascript
:
- Оператор
==
выполняет приведение к типу перед сравнением значений. Это означает, что JavaScript попытается преобразовать операнды к общему типу перед оценкой равенства. - В случае
45 == "45"
в JavaScript строка"45"
автоматически преобразуется в число, потому что другим операндом является число. JavaScript пытается выполнить неявное преобразование типов для сравнения. Строка"45"
может быть преобразована в число45
, и, следовательно, сравнение45 == "45"
оценивается какtrue
. - Аналогично ключевому слову Python
is
, в Javascript есть===
оператор сравнения. Который проверяет, расположены оба побочных объекта в одной и той же ячейке оперативной памяти компьютера или нет.
В Python
:
- В Python
45
и"45"
имеют разные типы.45
является экземпляромclass <integer>
, и"45"
является экземпляромclass <string>
. Они не являются экземплярами одного и того же класса. - В отличие от Javascript, Python не выполняет внутреннее преобразование типов, поэтому
print(45 == "45")
вычисляетFalse
. - Python использовал внутреннее преобразование типов, да, вы не ослышались, но есть одно условие. Python будет использовать внутреннее преобразование типов только с
boolean
объектами типа. - Итак, в выражении
print(True == 1)
логическое значение True неявно преобразуется в целое число1
перед выполнением сравнения. В результатеprint(1 == 1)
оценивается сравнение, которое являетсяTrue
. - Когда вы пишете,
print(True == 1)
эквивалентноprint(1 == 1)
. Когда интерпретатор Python достигает этой строки кода перед выполнением этого кода, он преобразуетсяprint(True == 1)
вprint(int(True) == 1)
, так что в конечном итоге это становитсяprint(1 == 1)
и теперь согласно==
правилу оба побочных объектаvalue
иtype <class int>
одинаковы, следовательно, вы видитеTrue
вывод в терминале. - Аналогично,
print(False == 0)
эквивалентноprint(int(False) == 0)
и, наконец,print(0 == 0)
вычисляется доTrue
.
Проверьте ЗДЕСЬ.
# Normal behavior
sample_1 = True
print(sample_1) # Output - True
print(int(sample_1)) # Output - 1
sample_2 = False
print(sample_2) # Output - False
print(int(sample_2)) # Output - 0
# Try with True - boolean
A = True + 5 # equivalent to `A = int(True) + 5`
print(A) # Output - 6 (True ---> 1)
# Try with False - boolean
B = False + 5 # equivalent to `A = int(False) + 5`
print(B) # Output - 5 (False ---> 0)
# Try both boolean together
final = False + True # equivalent to `final = int(False) + int(True)`
print(final) # Output - 1 (False ---> 0 & True ---> 1)
Надеюсь, это поможет всем!