Подтвердить что ты не робот

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

Предпочитает ли это делать:

if x is y:
    return True

или

if x == y
    return True

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

4b9b3361

Ответ 1

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

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

Для всех встроенных объектов Python (например, строк, списков, dicts, функций и т.д.), если x is y, то x == y также является True. Однако это не гарантируется вообще. Строго говоря, x == y истинно тогда и только тогда, когда 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

Ответ 2

x is y сравнивает тождества двух объектов и задает 'are 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 почти всегда является более конкретным сравнением, чем ==.

Ответ 3

  • == и != - операторы сравнения значений объектов
  • is и is not - операторы сравнения идентичности объектов

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

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

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

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

Нижняя строка

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

Ответ 4

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