6.10.2.Операции тестирования членства
Для типов контейнеров, таких как список, кортеж, набор, frozenset, dict или collection.deque, выражение x in y
эквивалентно any(x is e or x == e for e in y)
.
Для строковых и байтовых типов x in y
равно True
тогда и только тогда, когда x является подстрокой y.Эквивалентный тест - y.find(x) != -1
.Пустые строки всегда считаются подстрокой любой другой строки, поэтому "" in "abc"
вернет True
.
Для пользовательских классов, которые определяют метод __contains__()
, x in y
возвращает True
если y.__contains__(x)
возвращает истинное значение, а False
в противном случае.
Для пользовательских классов, которые не определяют __contains__()
, но определяют __iter__()
, x in y
равно True
, если какое-либо значениеz
с x == z
создается при итерации по y
.Если во время итерации возникает исключение, это как если бы in
вызывало это исключение.
Наконец, используется итерационный протокол старого стиля: если класс определяет __getitem__()
, x in y
равен True
тогда и только тогда, когда существует неотрицательный целочисленный индекс i
такой, что x == y[i]
, и все нижние целочисленные индексы не вызывают исключение IndexError.(Если возникает любое другое исключение, это как если бы возникло это исключение).
Информация, извлеченная с официальной страницы Python: https://docs.python.org/3/reference/expressions.html