Является ли 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.
  • Похоже на ключевое слово Pythonis, 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
Другие вопросы по тегам