Предпочтительные операторы сравнения Python

Это, предпочел делать:

if x is y:
    return True

или

if x == y
    return True

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

23
задан ensnare 5 April 2010 в 03:48
поделиться

4 ответа

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
40
ответ дан 29 November 2019 в 00:59
поделиться

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

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

15
ответ дан 29 November 2019 в 00:59
поделиться
  • == и ! = являются объектом значение операторы сравнения
  • равно и не являются идентификатором объекта операторы сравнения

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

однако, если вы посмотрите на большой объем кода Python, вы можете заметить, что равно не ), скорее всего, будет использоваться при сравнении против Истина , Ложь и Нет . Основная причина этого в том, что эти объекты являются одиночными, то есть существует ровно один экземпляр каждого из этих значений. Почему это имеет значение? ну, это приводит к другой причине ... скорости.

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

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

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

9
ответ дан 29 November 2019 в 00:59
поделиться

Зависит. равно , а не выполнить сравнение идентичностей, что подходит для Нет , Эллипсис или для проверки идентичности двух объектов. В противном случае используйте == или ! = .

4
ответ дан 29 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: