Является ли 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?". Этот вопрос имеет значение для написания надежного кода, который не будет терпеть неудачу из-за деталей реализации!

+210
04 мая '10 в 9:03
источник поделиться
6 ответов

В 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:

В числовом контексте (например, при использовании в качестве аргумента арифметического оператора) они [False и True] ведут себя как целые числа 0 и 1 соответственно.

Таким образом, логические значения явно рассматриваются как целые числа в Python 2.6 и 3.

Так что вы в безопасности, пока не появится Python 4. ;-)

+159
04 мая '10 в 9:18
источник

Связанные вопросы


Похожие вопросы

Ссылка на 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
+70
04 мая '10 в 9:16
источник

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

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

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

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

+22
04 мая '10 в 9:33
источник

Очень просто. Поскольку bool относится к оценке целого числа как bool, ТОЛЬКО ноль дает ложный ответ. Все значения Non-Zero, float, integers, включая отрицательные числа или что у вас есть, вернут true.

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

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

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

-1
04 авг. '18 в 19:52
источник

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

-2
09 апр. '18 в 14:49
источник

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

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

Документация python оператора == говорит (help ('==')):

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

Как следствие, False преобразуется в целое число для необходимости сравнения. Но он отличается от 0.

>>> 0 is False
False
-5
04 мая '10 в 9:11
источник

Посмотрите другие вопросы по меткам или Задайте вопрос