Неожиданный результат от оператора `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
)?