Предпочтительные операторы сравнения Python - PullRequest
23 голосов
/ 05 апреля 2010

Желательно ли делать:

if x is y:
    return True

или

if x == y
    return True

То же самое для "не"

Ответы [ 4 ]

40 голосов
/ 05 апреля 2010

x is y отличается от x == y.

x is y истинно тогда и только тогда, когда id(x) == id(y) - то есть x и y должны быть одним и тем же объектом (с одинаковыми id с).

Для всех встроенных объектов Python (например, строк, списков, диктов, функций и т. Д.), Если x is y, то x == y также имеет значение True. Тем не менее, это не гарантируется в целом. Строго говоря, x == y имеет значение true, если и только если x.__eq__(y) возвращает значение True.

Можно определить объект x с помощью метода __eq__, который всегда возвращает False, например, и это заставит x == y вернуть False, даже если x is y.

Итак, суть в том, что x is y и x == y - это совершенно разные тесты.

Рассмотрим это, например:

In [1]: 0 is False
Out[1]: False

In [2]: 0 == False
Out[2]: True

PS. Вместо

if x is y:
    return True
else:
    return False

Пиктоничнее писать

return x is y

и аналогично

if x == y:
    return True
else:
    return False

можно заменить на

return x == y
15 голосов
/ 05 апреля 2010

x is y сравнивает идентичности двух объектов и спрашивает 'являются ли x и y разные имена для одного и того же объекта?' Это эквивалентно id(x) == id(y).

x == y использует оператор равенства и задает более свободный вопрос 'равны ли x и y?' Для пользовательских типов это эквивалентно x.__eq__(y).

Специальный метод __eq__ должен представлять «равенство» для объектов, например, класс, представляющий дроби, хотел бы, чтобы 1/2 равнялся 2/4, даже если объект «одна половина» не может иметь одинаковую идентичность как объект «две четверти».

Обратите внимание, что a == b не только подразумевает a is b, но также верно и обратное. Одно из них не является более строгим требованием, чем другое. Да, это означает, что вы можете получить a == a return False, если вы действительно хотите, например:

>>> a = float('nan')
>>> a is a
True
>>> a == a
False

На практике is - это почти , всегда более точное сравнение, чем ==.

9 голосов
/ 05 апреля 2010
  • == и != являются объектом значение операторы сравнения
  • is и is not являются объектом идентичность операторы сравнения

, как уже говорили другие, isis not) только тогда, когда вы действительно заботитесь , что пара переменных ссылается на точно такой же объект. в большинстве случаев вам все равно, поэтому вы должны использовать == и !=.

однако, что вы можете заметить, если вы посмотрите на большую часть кода Python, так это то, что isis not) с большей вероятностью будут используется при сравнении с True, False и None. главная причина этого заключается в том, что эти объекты являются синглетонами, то есть имеется только один экземпляр каждого из этих значений. Почему это имеет значение? ну, это приводит к другой причине ... скорость.

с == и != интерпретатор должен подтянуть оба упомянутых объекта, чтобы провести сравнение (независимо от того, являются ли они одинаковыми или нет) в то время как is и is not просто проверяют значения объектов, на которые они ссылаются. сказав это, вы можете видеть, что последняя пара будет работать быстрее, потому что вам не нужно извлекать сами объекты, чтобы сделать сравнение. Вот тест скорости, проведенный пару лет назад, в котором мы пришли к выводу, что для разовых это не имеет большого значения, но если его называют миллиардным разом в тесной петле, ну, это начнет складываться.

http://mail.python.org/pipermail/tutor/2008-June/062708.html

Суть в том, что вы можете использовать сравнения идентификаторов объектов для проверки по True, False и None, а все остальное должно использовать прямые операторы равенства. мы не будем вдаваться в интернированные целые числа, методы привязанного экземпляра или что-то подобное. : -)

4 голосов
/ 05 апреля 2010

Зависит. is и is not выполняют сравнение идентификаторов, что подходит для None, Ellipsis или проверяют, совпадают ли два объекта. В противном случае используйте == или !=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...