Всем привет! Подскажите, почему оператор is ведет себя довольно странно, почему идентичность объектов равна False, тогда как по логике должна быть равна True. Почему так происходит? Объясните пожалуйста.
x = 1
y = x
print(x is y) # True
Но, если вызвать функцию id() которая вернет объекты типа int с одинковыми значениями становятся не идентичными:
print(id(x) is id(y)) # False
Здесь, по всей видимости возвращаются 2 разных объекта, но с одним и тем же значением, id объекта - 94232729371776. Если попытаться сравнить два других объекта типа int с одинаковым значением, то объекты идентичны:
a = 100
b = 100
print(a is b) # True
Почему в случае с функцией id, которая возвращает одно и тоже значение объекты разные? Как узнать какой объект (номер, id его) возвращает функция id?
isпроверяет значения в переменных на то, что они являются одним объектом. Если вы знаете о ссылках, то знаете, что переменные ссылаются на область в памяти. В первом случае они ссылаются на одну и ту же область в памяти, во втором на разные области и считаются разными объектами. Поэтому как правило простые типы сравнивают оператором==, а ссылочные черезis. – Alex Krass Oct 09 '17 at 07:04isможет давать какTrue, так иFalse. К примеру в текущих реализациях Python256 is (255+1) == True, а для257 is (256+1) == False. – insolor Oct 09 '17 at 07:12idгодится, но сравниватьidнужно по равенству значений (==), а не по равенству объектов (is) – insolor Oct 09 '17 at 07:16idведет себя таким образом, а целые числа в Python. – insolor Oct 09 '17 at 07:20