Предпочитает ли это делать:
if x is y:
return True
или
if x == y
return True
То же самое для "не"
Предпочитает ли это делать:
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 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
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
почти всегда является более конкретным сравнением, чем ==
.
==
и !=
- операторы сравнения значений объектов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
, а все остальное должно использовать операторы прямого выравнивания. мы не будем вводить интерналированные целые числа или связанные методы экземпляра, или что-то в этом роде здесь.: -)
Зависит. is
и is not
выполните сопоставление идентичности, что хорошо для None
, Ellipsis
или убедитесь, что два объекта одинаковы. В противном случае используйте ==
или !=
.