Является ли 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
?". Этот вопрос имеет значение для написания надежного кода, который не будет терпеть неудачу из-за деталей реализации!
Ответы
Ответ 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]
работает. Он не будет работать с объектом, который не является подклассом целого числа, поскольку индексирование списка работает только с целыми числами или объектами, которые определяют метод __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. ;-)
Ответ 2
Ссылка на 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
Ответ 3
В Python 2.x он не гарантируется вообще:
>>> False = 5
>>> 0 == False
False
Таким образом, это может измениться. В Python 3.x, True, False и None зарезервированные слова, поэтому приведенный выше код не будет работать.
В общем случае с булевыми вы должны предположить, что, хотя False всегда будет иметь целочисленное значение 0 (до тех пор, пока вы его не измените, как указано выше), True может иметь любое другое значение. Я бы не стал полагаться на какую-либо гарантию, что True==1
, но на Python 3.x это всегда будет иметь значение, несмотря ни на что.
Ответ 4
Очень просто. Поскольку bool относится к оценке целого числа как bool, ТОЛЬКО ноль дает ложный ответ. Все значения Non-Zero, float, integers, включая отрицательные числа или что у вас есть, вернут true.
Хорошим примером того, почему это полезно, является определение состояния питания устройства. On - любое ненулевое значение, off равно нулю. Электронно говоря это имеет смысл.
Чтобы определить истинные или ложные относительно между значениями, вам нужно что-то сравнить. Это относится к строкам и числовых значений, используя ==
или !=
Или <
, >
>=
, <=
и т.д.
Вы можете назначить целое число переменной, а затем получить значение true или false на основе этого значения переменной.
Ответ 5
Просто напишите int(False)
и вы получите 0
, если вы наберете int(True)
он выведет 1
Ответ 6
Ложь - это bool. У него другой тип. Это другой объект из 0, который является целым числом.
0 == False
возвращает значение True, потому что False передается целому числу. int (False) возвращает 0
Документация python оператора == говорит (help ('==')):
Операторы <
, >
, ==
, >=
, <=
и !=
сравнивают значения двух объектов. Объекты не должны иметь один и тот же тип. Если оба являются числами, они преобразуются в общий тип.
Как следствие, False преобразуется в целое число для необходимости сравнения. Но он отличается от 0.
>>> 0 is False
False