2015-05-22 2 views
3
In [1]: a=5 

In [2]: print(["is odd", "is even"][a % 2 == 0]) 
is odd 

In [3]: [a%2 == 0] 
Out[3]: [False] 

Что я понял - a % 2 == 0 - True или False.Bool as int? Как оценивает python

Так что если это правда, то это эквивалентно 1, и с использованием индексов списка он будет печатать 'is even'.

Я читал this и узнал, что bool является примером int.

Таким образом, при использовании в качестве индекса bool оценивает его эквивалентное число i.e 0 или 1.

Мой вопрос

на основе интуиции, мы можем знать, является ли это собирается быть int или bool

Но как знать Python? Имеются ли у него какие-либо критерии, когда следует использовать как bool и когда использовать как int? Все, что из документации Python3 было бы оценено.

+0

Вы не вычисляя Int здесь, но условное выражение, таким образом, вы, конечно, получающего BOOL – Paranaix

+1

Идите вперед и запустить '' False.real' и True.real' и посмотреть, что происходит – IanAuld

+0

@IanAuld False.real = 0, True.real = 1 – Ajay

ответ

6

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

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

В нормальных условиях в Python 2, и всегда в Python 3:

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

object 
    | 
    int 
    | 
    bool 

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

Edit:

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

Есть два типа целых чисел: [...] Целые числа (int) [...] Booleans (bool) и в булевом подразделе:

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

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

+0

в значительной степени понятное объяснение – bagrat

+0

спасибо mark-dickinson ?? – Ajay

0

В bool случаи, True и False, отделены от int экземпляров, и 01. Дело в том, что bools ведут себя как целые числа во многих контекстах. Например, True+True, который равен 2. Однако если мы проверяем, являются ли они одним и тем же объектом, мы видим, что это не так: True is 1. С другой стороны, это правда, что True is True. Вот пример, который ведет себя как целые числа, но печатается как True и False и сравнивается по-разному с is.

class Bool(int): 
    def __repr__(self): 
     return 'True' if self==1 else 'False' 

https://docs.python.org/3/library/stdtypes.html#bltin-boolean-values

Смежные вопросы