Это false == 0 и true == 1 в Python, деталь реализации или гарантируется языком?

StackOverflow https://stackoverflow.com/questions/2764017

Вопрос

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

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

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

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

Это было полезно?

Решение

В Python 2.x это нет гарантированно, как это возможно для True а также False быть переназначенным. Однако, даже если это произойдет, логический истинный и логический ложный ложный, все еще правильно возвращен для сравнения.

В Python 3.x. True а также False это ключевые слова и всегда будут равны 1 а также 0.

При нормальных обстоятельствах в Python 2 и всегда в Python 3:

False Объект имеет тип bool который является подклассом int:

object
   |
 int
   |
 bool

Это единственная причина, почему в вашем примере, ['zero', 'one'][False] работает. Это не будет работать с объектом, который не является подклассом целого числа, потому что индексация списка работает только с целыми числами или объектами, которые определяют __index__ Метод (спасибо Марк-Дикинсон).

Редактировать:

Это верно для текущей версии Python, а также из Python 3. Документы для Python 2.6 и то Документы для Python 3 Оба говорят:

Есть два типа целых чисел: [...] целые числа (INT) [...] Booleans (Bool)

и в логическом подразделе:

Booleans: Они представляют значения истинности FALSE и True [...] логические значения, которые ведут себя как значения 0 и 1, соответственно, почти во всех контекстах, исключение в том, что при преобразовании в строку строки «ложные» или «True» «Возвращаются соответственно.

Существует также, для Python 2.:

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

Таким образом, логическиены явно рассматриваются как целые числа в 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 логическое значение верно для всех целых чисел, кроме 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, правда, ложь, и никто не Зарезервированные слова, Так что вышеуказанный код не будет работать.

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

Очень простой. Как Bool относится к оценке целого числа в качестве боля, только ноль дает ложный ответ. Все ненулевые значения, поплавки, целые числа, включая негативные числа, или что у вас, вернемся.

Приятный пример того, почему это полезно, определяет состояние питания устройства. На любое ненулевое значение, выключение равен нулю. В электронном виде это имеет смысл.

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

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

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

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

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

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

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

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

>>> 0 is False
False
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top