Это, предпочел делать:
if x is y:
return True
или
if x == y
return True
То же самое для "не"
x is y
отличается от x == y
.
x is y
истинно тогда и только тогда, когда id (x) == id (y)
- то есть x
и y
] должны быть одним и тем же объектом (с одним и тем же id
s).
Для всех встроенных объектов Python (например, строк, списков, dicts, функций и т. Д.), Если x равно y
, то x == y
также истинно. Однако в целом это не гарантируется. Строго говоря, x == y
истинно тогда и только тогда, когда x .__ eq __ (y)
возвращает True.
Можно определить объект x
с помощью метода __ eq __
, который всегда возвращает False, например, и это приведет к тому, что x == y
будет вернуть False, даже если x равно 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
в Pythonic. И аналогично,
if x == y:
return True
else:
return False
можно заменить на
return x == y
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
На практике, хотя равно
равно почти всегда более конкретное сравнение, чем ==
.
==
и ! =
являются объектом значение операторы сравнения равно
и не
являются идентификатором объекта операторы сравнения , как уже говорили другие, является
(и не является
) только тогда, когда вы действительно заботитесь , что пара переменных является ссылаясь на точно такой же объект. в большинстве случаев вам вообще все равно, поэтому вы должны использовать ==
и ! =
.
однако, если вы посмотрите на большой объем кода Python, вы можете заметить, что равно
(а не
), скорее всего, будет использоваться при сравнении против Истина
, Ложь
и Нет
. Основная причина этого в том, что эти объекты являются одиночными, то есть существует ровно один экземпляр каждого из этих значений. Почему это имеет значение? ну, это приводит к другой причине ... скорости.
с ==
и ! =
, интерпретатор должен вытащить оба упомянутых объекта, чтобы провести сравнение (одинаковы они или нет), в то время как - это
, а - это не
, просто проверьте значения объектов, на которые они ссылаются. с учетом сказанного вы можете видеть, что последняя пара будет работать быстрее, потому что вам не нужно извлекать сами объекты, чтобы провести сравнение. вот тест скорости, проведенный пару лет назад, из которого мы пришли к выводу, что для разового использования это не имеет большого значения, но если его вызвать миллиард раз в узком цикле, что ж, он начнет складываться.
http://mail.python.org/pipermail/tutor/2008-June/062708.html
суть в том, что вы можете использовать сравнение идентификаторов объектов для проверки на соответствие True
, False
и None
, а все остальное должно использовать прямую операторы равенства. мы не будем углубляться в интернированные целые числа, связанные методы экземпляра или что-то подобное здесь. : -)
Зависит. равно
, а не
выполнить сравнение идентичностей, что подходит для Нет
, Эллипсис
или для проверки идентичности двух объектов. В противном случае используйте ==
или ! =
.