Является ли False == 0 и True == 1 в Python подробностями реализации или это гарантировано языком? - PullRequest
219 голосов
/ 04 мая 2010

Гарантируется ли, что False == 0 и True == 1 в Python (при условии, что они не переназначены пользователем)? Например, гарантируется ли каким-либо образом, что следующий код всегда будет давать одинаковые результаты, независимо от версии Python (как существующей, так и, вероятно, будущей)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

Любая ссылка на официальную документацию приветствуется!

Редактировать : Как отмечалось во многих ответах, bool наследуется от int. Поэтому вопрос можно переформулировать следующим образом: «Официально ли в документации сказано, что программисты могут полагаться на логические значения, наследуемые от целых чисел со значениями 0 и 1?» Этот вопрос актуален для написания надежного кода, который не потерпит неудачу из-за деталей реализации!

Ответы [ 6 ]

166 голосов
/ 04 мая 2010

В 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. ; -)

70 голосов
/ 04 мая 2010

Ссылка на 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
22 голосов
/ 04 мая 2010

В Python 2.x это вообще не гарантируется:

>>> False = 5
>>> 0 == False
False

Так что это может измениться. В Python 3.x True, False и None являются зарезервированными словами , поэтому приведенный выше код не будет работать.

В общем случае с логическими значениями следует предполагать, что, хотя False всегда будет иметь целочисленное значение 0 (если вы не измените его, как указано выше), True может иметь любое другое значение. Я не обязательно буду полагаться на какую-либо гарантию, что True==1, но в Python 3.x это всегда будет так, несмотря ни на что.

0 голосов
/ 04 августа 2018

Очень просто. Поскольку bool относится к оценке целого числа как bool, ТОЛЬКО ноль дает ложный ответ. ВСЕ Ненулевые значения, числа с плавающей запятой, целые числа, включая отрицательные числа, или что у вас есть, вернут true.

Хорошим примером того, почему это полезно, является определение состояния питания устройства. On - любое ненулевое значение, off - ноль. В электронном виде это имеет смысл.

Чтобы определить true или false относительно значений, у вас должно быть что-то для сравнения. Это относится к строкам и числовым значениям, используя == или != или <, > >=, <= и т. Д.

Вы можете назначить целое число переменной, а затем получить значение true или false на основе значения этой переменной.

0 голосов
/ 09 апреля 2018

Просто напишите int(False), и вы получите 0, если вы наберете int(True), будет выведено 1

0 голосов
/ 04 мая 2010

Ложь - это бул. У него другой тип. Это отличный от 0 объект, который является целым числом.

0 == False возвращает True, потому что False приводится к целому числу. int (False) возвращает 0

В документации по Python оператора == написано (help ('==')):

Операторы <, >, ==, >=, <= и != сравнивают значения двух объектов. Объекты не обязательно должны быть одного типа. Если оба числа являются числами, они преобразуются в общий тип.

В результате False преобразуется в целое число для сравнения. Но это отличается от 0.

>>> 0 is False
False
...