Задать вопрос

В чем различие == и 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
О каких тогда объектах идет речь? Не ужели о экземплярах класса, а не переменных
  • Вопрос задан
  • 52710 просмотров
Подписаться 4 Средний 1 комментарий
Решения вопроса 4
- оператор==проверяет равенство значений двух объектов
- оператор 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
Ответ написан
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 тоже самое
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Alexander_134
Используется примерно в этих случаях:

lst1 = [1,2,3]
lst2 = [1,2,3]
lst3 = lst1

print(lst1 == lst3) #True
print(lst1 == lst2) #True

print(lst1 is lst3) #True
print(lst1 is lst2) #False !!!

Все потому, что lst1 и lst3 ссылаются на один объект и если мы его изменим (например, добавим новое значение через lst3, то и lst1 тоже изменится). Таким образом, оператор "==" проверяет равенство значений, а "is" проверяет, ссылаются ли переменные на один и тот же объект.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы