Ложь == 0 и Верна == 1 деталь реализации, или она гарантируется языком?

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

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

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

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

230
задан Georgy 5 November 2019 в 02:53
поделиться

4 ответа

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

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

Обычно в Python 2 и всегда в Python 3:

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

object
   |
 int
   |
 bool

Это единственная причина, по которой в вашем примере ['ноль', 'один'] [Ложь] действительно работает. Это не будет работать с объектом, который не является подклассом целого числа, потому что индексирование списка работает только с целыми числами или объектами, которые определяют метод __ index __ (спасибо mark-dickinson ).

Изменить:

Это верно как для текущей версии Python, так и для версии Python 3. В документах для Python 2.6 и для Python 3 говорится:

Есть два типа целых чисел: [...] Целые числа (int) [...] Логические (bool)

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

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

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

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

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

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

173
ответ дан 23 November 2019 в 03:41
поделиться

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

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

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

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

22
ответ дан 23 November 2019 в 03:41
поделиться

Ссылка на 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
72
ответ дан 23 November 2019 в 03:41
поделиться

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

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

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

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

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

>>> 0 is False
False
-5
ответ дан 23 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

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