Гарантируется ли это False == 0
и True == 1
в Python (при условии, что они не переназначены пользователем)? Например, гарантируется ли каким-либо образом, что следующий код всегда будет давать одинаковые результаты, независимо от версии Python (как существующей, так и, вероятно, будущей)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Любая ссылка на официальную документацию будет высоко ценится!
Изменить : как отмечено во многих ответах, bool
наследуется от int
. Поэтому вопрос можно переформулировать так: «Официально ли в документации сказано, что программисты могут полагаться на логические значения, наследуемые от целых чисел, со значениями 0
и1
?». Этот вопрос актуален для написания надежного кода, который не потерпит неудачу из-за деталей реализации!
python
boolean
equality
language-specifications
Эрик О Лебиго
источник
источник
sum(bool_list)
. В противном случае вам придется написатьsum(1 for x bool_list if x)
.bool_list.count(True)
это более явно; это также примерно в 3 раза быстрее… :)Ответы:
В Python 2.x это не гарантируется, поскольку это возможно
True
иFalse
может быть переназначено. Тем не менее, даже если это произойдет, логическое значение True и логическое значение False по-прежнему будут возвращены для сравнения.В Python 3.x
True
иFalse
есть ключевые слова и всегда будут равны1
и0
.При обычных обстоятельствах в Python 2 и всегда в Python 3:
False
Объект имеет тип,bool
который является подклассомint
:Это единственная причина, почему в вашем примере,
['zero', 'one'][False]
работает. Он не будет работать с объектом, который не является подклассом целого числа, поскольку индексирование списка работает только с целыми числами или объектами, которые определяют__index__
метод (спасибо mark-dickinson ).Редактировать:
Это верно в отношении текущей версии Python и Python 3. Документы для Python 2.6 и документы для Python 3 говорят:
и в логическом подразделе:
Для Python 2 также есть :
Таким образом, логические значения явно рассматриваются как целые числа в Python 2.6 и 3.
Так что вы в безопасности, пока не появится Python 4. ;-)
источник
__index__
метод, может использоваться как индекс списка; не только подклассыint
илиlong
.a = True; True = 'i am an idiot'; a == True
=> Ложь. Помимо такого переназначения, значения по умолчанию стандартизированы как 0 и 1, и я полагаю, что это обычная практика - зависеть от этого; например, для индексации в массив из двух элементов, где [0] содержит ложный регистр, [1] true.Ссылка на PEP, обсуждающую новый тип bool в Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
При преобразовании bool в int целочисленное значение всегда равно 0 или 1, но при преобразовании int в bool логическое значение True для всех целых чисел, кроме 0.
источник
В Python 2.x это вообще не гарантируется:
Так что это может измениться. В Python 3.x True, False и None являются зарезервированными словами , поэтому приведенный выше код не будет работать.
В общем случае с логическими значениями следует предполагать, что, хотя False всегда будет иметь целочисленное значение 0 (если вы не измените его, как указано выше), True может иметь любое другое значение. Я не обязательно буду полагаться на это
True==1
, но в Python 3.x это будет всегда, несмотря ни на что.источник
Очень просто. Поскольку bool относится к оценке целого числа как bool, ТОЛЬКО ноль дает ложный ответ. ВСЕ Ненулевые значения, числа с плавающей запятой, целые числа, включая отрицательные числа, или что у вас есть, вернут true.
Хорошим примером того, почему это полезно, является определение состояния питания устройства. On - любое ненулевое значение, off - ноль. В электронном виде это имеет смысл.
Чтобы определить true или false относительно значений, у вас должно быть что-то для сравнения. Это относится к строкам и числовых значений, используя
==
или!=
или<
,>
>=
,<=
и т.д.Вы можете назначить целое число переменной, а затем получить значение true или false на основе значения этой переменной.
источник
Просто напишите,
int(False)
и вы получите0
, если вы напечатаете,int(True)
он будет выводить1
источник
int()
, с простым числовым значением, а не то, что они точно идентичны 0 и 1.Ложь это бул. У него другой тип. Это отличный от 0 объект, который является целым числом.
0 == False
возвращает True, потому что False приводится к целому числу. int (False) возвращает 0Документация Python об операторе == гласит (help ('==')):
Как следствие, False преобразуется в целое число для сравнения. Но это отличается от 0.
источник
bool
это подклассint
, поэтому в очень реальном смысле bool - это целое число. Например,isinstance(True, int)
возвращает True. И проверка на равенство не преобразует bool в int, поскольку преобразование не требуется: оно просто вызываетint.__cmp__
напрямую. Обратите внимание, чтоbool.__cmp__ is int.__cmp__
также оценивается какTrue
.isinstance(True, int)
=> Верно. То есть, True IS целого, и не требует преобразований.while response is False
работал, иwhile response == False
не .. Спасибо!0 is False
ложно, ничего вам не говорит. В вашем интерактивном переводчике введитеx = -10
, затемy = -10
, тогда,x is y
и это также будет ложным. Тот факт, что существуют определенные оптимизации, когда интерпретатор Python повторно использует одни и те же целочисленные объекты в определенных обстоятельствах (хранение целочисленных литералов в качестве констант, интернирование небольших целых чисел), не означает, что этоis
следует использовать, когда вы хотите проверить на равенство целочисленных значений .