Почему (1 в [1,0] == Истина) оценивается в False?

Когда я смотрел ответы на этот вопрос, я обнаружил, что не понял свой собственный ответ.

Я действительно не понимаю, как это разбирается. Почему второй пример возвращает False?

>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

Спасибо за любую помощь. Я думаю, что я должен упустить что-то действительно очевидное.


Я думаю, что это немного отличается от связанного дубликата:

Почему выражение 0 < 0 == 0 return False в Python?.

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

Взглянув на 0 < 0 == 0, вы можете представить, что каждая половина оценивается и делает смысл в качестве выражения:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

Итак, ссылка отвечает, почему это оценивает False:

>>> 0 < 0 == 0
False

Но мой пример 1 in ([1,0] == True) не имеет смысла как выражение, поэтому вместо наличия двух (по общему признанию, неправильных) возможных интерпретаций возможно только одно:

>>> (1 in [1,0]) == True

Ответ 1

Python фактически применяет цепочку операторов сравнения здесь. Выражение переведено на

(1 in [1, 0]) and ([1, 0] == True)

что, очевидно, False.

Это также происходит для выражений типа

a < b < c

которые переводятся на

(a < b) and (b < c)

(без оценки b дважды).

Подробнее см. документацию на языке Python.