Является ли False == 0 и True == 1 в Python подробностями реализации или это гарантировано языком?
Гарантируется ли это, что False == 0
а также True == 1
в Python (при условии, что они не переназначены пользователем)? Например, гарантируется ли каким-либо образом, что следующий код всегда будет давать одинаковые результаты, независимо от версии Python (как существующей, так и, вероятно, будущей)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Любая ссылка на официальную документацию будет высоко ценится!
Изменить: как отмечено во многих ответах, bool
наследуется от int
, Поэтому вопрос можно переформулировать следующим образом: "Официально ли в документации сказано, что программисты могут полагаться на логические значения, наследуемые от целых чисел, со значениями? 0
а также 1
?". Этот вопрос актуален для написания надежного кода, который не потерпит неудачу из-за деталей реализации!
7 ответов
В 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).
Редактировать:
Это верно в отношении текущей версии Python и Python 3. Документы для Python 2.6 и документы для Python 3 говорят:
Существует два типа целых чисел: [...] Integer (int) [...] Booleans (bool)
и в логическом подразделе:
Booleans: они представляют значения истинности False и True [...] логические значения ведут себя как значения 0 и 1, соответственно, почти во всех контекстах, за исключением того, что при преобразовании в строку строки "False" или "True возвращаются, соответственно.
Таким образом, логические значения явно рассматриваются как целые числа в Python 2.6 и 3.
Так что вы в безопасности, пока не появится Python 4.;-)
Ссылка на 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
В Python 2.x это не гарантируется вообще:
>>> False = 5
>>> 0 == False
False
Так что это может измениться. В Python 3.x True, False и None являются зарезервированными словами, поэтому приведенный выше код не будет работать.
В общем случае с логическими значениями следует предполагать, что, хотя False всегда будет иметь целочисленное значение 0 (если вы не измените его, как указано выше), True может иметь любое другое значение. Я не обязательно буду полагаться на какую-либо гарантию, что True==1
, но в Python 3.x это всегда будет так, несмотря ни на что.
Давайте разобьем этот вопрос на две части.
Питон:
print(45 == "45") # Output - False
Javascript:
console.log(45 == "45") # Output - true
Здесь большинство людей думают, что Javascript проверяет только значение обоих побочных объектов. Но это неправда.console.log(45 == "45")
похож на .
Но теперь у вас возник вопрос: если оба синтаксиса похожи, почему я получаю разные результаты?
ВJavascript
:
- Оператор выполняет приведение типов перед сравнением значений. Это означает, что JavaScript попытается преобразовать операнды к общему типу перед оценкой равенства.
- В случае с JavaScript строка автоматически преобразуется в число, поскольку другой операнд является числом. JavaScript пытается выполнить неявное преобразование типов для сравнения. Строку можно преобразовать в число, и, следовательно, сравнение
45 == "45"
оценивается какtrue
. - Похоже на ключевое слово Python
is
, Javascript имеет===
Оператор сравнения. Который проверяет, расположены ли оба побочных объекта в одном и том же месте оперативной памяти компьютера или нет.
ВPython
:
- В Python и есть разные типы.
45
является примеромclass <integer>
, и"45"
является примеромclass <string>
. Они не являются экземплярами одного и того же класса. - В отличие от Javascript, Python не выполняет внутреннее преобразование типов.
print(45 == "45")
оцениваетFalse
. - Python использовал внутреннее преобразование типов. Да, вы не ослышались, но есть одно условие. Python будет использовать внутреннее преобразование типов только с
boolean
тип объектов. - Таким образом, в выражении логическое значение True неявно приводится к целому числу.
1
перед выполнением сравнения. В результате оценивается сравнение, которое составляет . - Когда вы пишете, эквивалентно . Когда интерпретатор Python достигает этой строки кода перед выполнением этого кода, он преобразуется
print(True == 1)
кprint(int(True) == 1)
, Итак, наконец, это становитсяprint(1 == 1)
и теперь согласно==
управлять обеими сторонами объектаvalue
иtype <class int>
одинаковы, поэтому вы видите вывод в терминале. - Сходным образом,
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)
Надеюсь, это поможет всем!
Очень просто. Поскольку bool относится к оценке целого числа как bool, ТОЛЬКО ноль дает ложный ответ. ВСЕ Ненулевые значения, числа с плавающей запятой, целые числа, включая отрицательные числа, или что у вас есть, вернут true.
Хорошим примером того, почему это полезно, является определение состояния питания устройства. On- любое ненулевое значение, off - ноль. В электронном виде это имеет смысл.
Чтобы определить true или false относительно значений, у вас должно быть что-то для сравнения. Это относится к строкам и числовым значениям, используя ==
или же !=
или же <
, >
>=
, <=
, так далее.
Вы можете назначить целое число переменной, а затем получить значение true или false на основе значения этой переменной.
Просто пиши int(False)
и вы получите 0
, если вы введете int(True)
это будет выводить 1
Ложь это бул. У него другой тип. Это отличный от 0 объект, который является целым числом.
0 == False
возвращает True, потому что False приводится к целому числу. int(False) возвращает 0
Документация Python об операторе == гласит (help('==')):
Операторы
<
,>
,==
,>=
,<=
, а также!=
сравнить значения двух объектов. Объекты не обязательно должны быть одного типа. Если оба числа, они конвертируются в общий тип.
Как следствие, False преобразуется в целое число для сравнения. Но это отличается от 0.
>>> 0 is False
False