Почему (1 в [1,0] = = True) оценивается как 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's 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 == 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 147

1 ответ:

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

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

заведомо False.

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

a < b < c

что переводится как

(a < b) and (b < c)

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

посмотреть документация на языке Python для более подробной информации.