проверяет ли ключевое слово питонов "in" на "is" или "==" - PullRequest
0 голосов
/ 25 февраля 2019

Что именно проверяет ключевое слово in в python, вообще?равенство, идентичность, что-то еще?

Пример:

Предположим, у меня есть два класса X и Y с разными __eq__ операторами

class X:
  def __eq__(self,other):
    return False

class Y:
  def __eq__(self,other):
    return True

Теперь я могу сделать

a = X()
b = a
k = [a]
b in k # -> True

Это предполагает проверку на идентичность для меня.
Но я также могу сделать

c = Y()
d = Y()
c is d # -> False
l = [d]
c in l # -> True

, которая предлагает проверку на равенство.Единственная теория, которую я выдвинул, состоит в том, что она сначала проверяет идентичность, а если это не так, то проверяет равенство.Это правильно?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Верный ответ заключается в том, что само по себе in не выполняет никаких тестов - это зависит от реализации контейнера (объекта после in в вашем выражении).in на самом деле вызовет либо container.__contains__(obj), если он определен, либо container.__getitem__(obj), и вернет результат.Как контейнер реализует тест (идентичность, равенство, тайный алгоритм, основанный на фазе Луны и дате рождения капитана), вызывает озабоченность контейнера.

0 голосов
/ 25 февраля 2019

Проверка содержимого в списке эквивалентна поиску идентичности или равенства для каждого элемента.

Из документации :

Для типов контейнеров, таких как list, tuple, set, frozenset, dict или collection.deque , выражение x in y эквивалентно any(x is e or x == e for e in y)

(спредостережение о том, что объекты в контейнере на основе хеша, например, в наборе, должны иметь хеш-реализацию, соответствующую их определению равенства.)

Для пользовательских типов контейнеров поведение in имеет видопределяется методом __contains__.

...