идентичность и равенство для 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