В чем различие == и IS в Python?

Сейчас нахожусь на начальной стадии изучения языка. Не совсем понятно отличие IS и Is Not от == и !=
В литературе указано что Is и Is Not проверяют принадлежность к одному объекту, а операторы сравнения сравнивают
Но на практике
a = 1 и b=1
a is b возвращает true
пойдем дальше
a= 2+2 b=2+4-2 - все равно true
Ладно, сравним eval("2+2") is eval("2+4-2") - True
О каких тогда объектах идет речь? Не ужели о экземплярах класса, а не переменных
  • Вопрос задан
  • 49754 просмотра
Решения вопроса 1
- оператор==проверяет равенство значений двух объектов
- оператор is проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти

Python (CPython, если быть точнее) в целях производительности кеширует короткие строки и малые целые числа, поэтому возможны такие казусы:

>>> str1 = 'hello'
>>> str2 = 'hello'
>>> str1 == str2
True
>>> str1 is str2
True
>>>


Но стоит сделать строку длиннее и всё встаёт на свои места:

>>> str1 = 'hello, my crazy world'
>>> str2 = 'hello, my crazy world'
>>> str1 == str2
True
>>> str1 is str2
False
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
mututunus
@mututunus
Backend developer (Python, Golang)
is проверяет, что переменные указывают на один и тот же объект в памяти. Но особенность в том, что, для экономии памяти, булевы типы, числа и строки могут кешироваться.
Ответ написан
Комментировать
@nirvimel
Экземпляр класса - это и есть объект, а переменная это просто имя, которому сопоставлено некоторое значение. А так как в Python любое значение - это объект (экземпляр) какого-то класса, то операторы is и == всегда применяются к значениям переменных, то есть к объектам (экземплярам) класса.

А чтобы понять различия между операторами is и == запустите этот код и посмотрите на вывод:
class AlwaysEqual(object):
    def __eq__(self, other):
        return True

instance = AlwaysEqual()
print (instance == 42)  # True
print (instance is 42)  # False
print (instance is AlwaysEqual())  # False
print (instance is instance)  # True

Это пример класса, любой экземпляр которого всегда равен (==) всему, чему угодно.
В то же время, экземпляр этого класса не является (is) другим экземпляром этого же класса и ничем другим кроме самого себя.
Ответ написан
Комментировать
sim3x
@sim3x
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. :-)


https://docs.python.org/2/c-api/int.html#c.PyInt_F...

в 3 тоже самое
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы