идентичность и равенство для None в Python
различные руководства Python говорят использовать x is None
вместо x == None
. Почему так? Равенство используется для сравнения значений, поэтому кажется естественным спросить, если x
имеет значение None
, далее ==
, а не is
. Может кто-нибудь объяснить, почему is
является предпочтительной формой и показывает пример, когда два не дают один и тот же ответ?
спасибо.
3 ответов
причина, по которой люди используют is
потому что нет никакого преимущества в использовании ==
. Можно написать объекты, которые сравниваются равными None
, но это редкость.
class A(object):
def __eq__(self, other):
return True
print A() == None
выход:
True
на is
оператор тоже быстрее, но я не считаю этот факт важным.
на is
ключевое слово проверяет идентичность. Это не оператор сравнения, как ==
. Используя is
не просто проверяет, имеют ли два аргумента одинаковое значение и / или одинаковую внутреннюю структуру: а именно, проверяет, действительно ли они ссылаются на один и тот же объект в памяти. Существует множество последствий этого, один из них заключается в том, что is
не может быть перегружен, а другое существо, поведение которого отличается между изменяемыми и неизменяемыми типами. Например, рассмотрим следующий:
>>> l1 = range(5)
>>> l2 = range(5)
>>> l1 == l2
True
>>> l1 is l2
False
>>> l3 = l1
>>> l1 is l3
True
>>> s1 = "abcde"
>>> s2 = "abcde"
>>> s1 == s2
True
>>> s1 is s2
True
здесь, поскольку списки изменчивы, они не могут совместно использовать местоположение в памяти, и, следовательно,is
и ==
выход несоответствующие результаты. С другой стороны, строки неизменяемы, и поэтому в некоторых случаях их память может быть объединена. В основном, is
можно надежно использовать только для простых, неизменяемых типов или в случаях, когда несколько имен указывают на один и тот же объект в памяти (например, использование l3
в приведенном выше примере), и его использование указывает на желание проверить личность, а не значение. Я бы ожидал is
чтобы быть немного быстрее, чем ==
потому что он не выполняет поиск метода, но я могу ошибаться. Конечно, для сложных контейнерных объектов, таких как списки или дикты,is
должна быть намного быстрее, чем ==
(O (1) против O (n), предположительно). Тем не менее, проблема скорости в основном спорная, поскольку эти два не следует рассматривать как взаимозаменяемые.
PEP 8 говорит: "Сравнения с синглетами, как ни один, всегда должны делаться с "есть" или "нет", а не с операторами равенства. Вот довольно хорошее объяснение, почему:--1-->
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html