Таинственные случаи логических выражений, эквивалентностей и идентификаторов объектов
Первая тайна струн:
Как так bool('foo')
возвращается True
?
если
'foo' == True
возвращаетсяFalse
'foo' == False
возвращаетсяFalse
'foo' is True
возвращаетсяFalse
'foo' is False
возвращаетсяFalse
Вторая тайна целых чисел:
Как так bool(5)
возвращается True
?
если
5 == True
возвращаетсяFalse
5 == False
возвращаетсяFalse
5 is True
возвращаетсяFalse
5 is False
возвращаетсяFalse
Третья тайна нулей:
Как так bool(0)
возвращается False
?
если
0 == True
возвращаетсяFalse
0 == False
возвращаетсяTrue
<- Особый случай0 is True
возвращаетсяFalse
0 is False
возвращаетсяFalse
Я знаю кое-что о правдивости Python, однако все это кажется немного загадочным. Кто-то может пролить свет на это?
2 ответа
Вам нужно прочитать это: https://docs.python.org/2/library/stdtypes.html
'foo' == True # -> False
'' == True # -> False
'' == False # -> False
всегда будет False
, строка не равна bool
, но да - bool('non-empty-str') -> True
; bool('') -> False
,
и так далее для вас другие "загадки".
is
сравнивает личности id()
из двух объектов (здесь также есть некоторые загадки: что с Integer Cache внутри Python?)
также это может быть интересно: False == 0 и True == 1 в Python - подробности реализации или это гарантировано языком?
Это потому, что оба 0
а также ''
являются False
в Python, в то время как непустые строки и ненулевые целые числа имеют значение True.
Во всех ваших примерах причина, по которой они возвращаются иначе, чем ваши ожидания, заключается в том, что ==
проверяет на то же value
в то время как is
проверяет, указывают ли два на один и тот же объект.
Так что в первом случае foo
является True
, но они не имеют одинаковое значение. Также, foo
не указывает на то же значение, что и True
вот почему он возвращает ложь. Та же самая картина продолжается для остальных примеров.