Неожиданный результат от оператора `in` - Python

>>> item = 2
>>> seq = [1,2,3]
>>> print (item in seq)
True
>>> print (item in seq is True)
False

Почему второй оператор print выводит False?

Ответы

Ответ 1

in и is являются операторами сравнения в Python, то же самое в этом отношении, как, скажем, < и ==. В общем,

expr1 <comparison1> expr2 <comparison2> expr3

рассматривается как

(expr1 <comparison1> expr2) and (expr2 <comparison2> expr3)

за исключением того, что expr2 оценивается только один раз. Вот почему, например,

0 <= i < n

работает как ожидалось. Однако это относится к любым цепным операторам сравнения. В вашем примере

item in seq is True

рассматривается как

(item in seq) and (seq is True)

Часть seq is True False, поэтому все выражение False. Чтобы получить то, что вы, вероятно, предназначили, используйте круглые скобки для изменения группировки:

print((item in seq) is True)

Нажмите здесь, чтобы ознакомиться с документами.

Ответ 2

Ваше утверждение item in seq is True внутренне оценивается как (item in seq) and (seq is True), как показано ниже

>>>print ((item in seq) and (seq is True))
False

(seq is True) является False, и поэтому ваш оператор выводит False.

Ответ 3

Ответ ниже неверен. Комментарий объясняет, что я проверен:

In [17]: item in (seq is True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-4e7d6b2332d7> in <module>()
----> 1 item in (seq is True)

TypeError: аргумент типа 'bool' не повторяется


Предыдущий ответ Я считаю, что он оценивает seq is True (который оценивает значение bool False), а затем оценивает item in False (который оценивается как False).

Предположительно вы имеете в виду print (item in seq) is True (который оценивается как True)?