Таинственные случаи логических выражений, эквивалентностей и идентификаторов объектов

Первая тайна струн:
Как так 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 вот почему он возвращает ложь. Та же самая картина продолжается для остальных примеров.

Другие вопросы по тегам