Почему (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
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 для более подробной информации.