Найти в Дзене
proger ЧАЙНИК

Проверка обектов на идентичность в Python

В Python одинаковые значения могут существовать в виде множества копий. Вот что я имею в виду:

a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a)  
>>> [1, 2, 3]
print(b) 
>>> [1, 2, 3]
print(c)
>>> [1, 2, 3]

С первого взгляда кажется, что эти переменные одинаковые. Однако не всё так просто. Давайте изменим список a.

a = [1, 2, 3]
b = [1, 2, 3]
c = a
a[0] = 6
print(a)
>>> [6, 2, 3] - первый элемент поменялся
print(b)
>>> [1, 2, 3]
print(c)
>>> [6, 2, 3] - также поменялся

Это произошло по той причине, что мы создали две копии [1, 2, 3]. a и c ссылаются на первую копию, b ссылается на другую. Поэтому, если изменить один элемент (a или c), то изменится и другой, ведь они ссылаются на один и тот же объект в памяти!

-2

Id функция

Каждый объект в Python имеет связанное целое число, называемое identity. Можно получить это число, вставив объект в функцию id(). Числа, строки и другие примитивные типы также считаются объектами, поэтому у них также есть свой id. Identity никогда не меняется, пока существует объекта. Разные объекты в памяти имеют разные id.

Используя id(), мы можем различить два объекта, которые содержат в себе одинаковое значение. Например:

a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)  
>>> True
print(id(a))
>>> 4496492864
print(id(b))
>>> 4496492992

Обратите внимание, что при сравнении при помощи оператора сравнения возвращается True, то есть кажется, что они идентичны. Но если воспользоваться id-функцией, то мы поймем, что они, оказывается, разные.

Но если две переменные ссылаются на один и тот же объект, то функция id вернет одно и то же значение.

a = [0, 1, 5]

c = a
print(a == c) 
>>> True
print(id(a))  
>>> 4496492928
print(id(c))  
>>> 4496492928

Посмотрите, id(a) и id(с) возвращают одно и то же значение. Почему? Потому что они ссылаются на один и тот же объект, хранимый в памяти компьютера.

К этому моменту мы научились проверять, ссылаются ли две переменные на один и тот же объект, сравнивая результаты функции id(). Однако существует другой способ сделать это. В языке Python есть специальный оператор – identity operator is, результат которого булевое значение: True или False. Но не путайте его с оператором сравнения ==, который проверяет, содержат ли два объекта одно и то же значение.

a = [1, 2, 3]
b = [1, 2, 3]
identity = a is b  
>>> False # потому что ссылаются на разные объекты памяти
equality = a == b
>>> True, потому что a и b имеют одно и то же значение
b = a
identity = a is b
>>> True, потому что ссылаются на один и тот же объект памяти

Также можно воспользоваться оператором отрицания is not.

a = [1, 2, 3]
b = [1, 5]
print(a is not b)
>>> True

Спасибо за внимание! Если вам понравилась статья, то ставьте лайки, делитесь с друзьями. Остались вопросы или замечания? Буду рад видеть ваши комментарии.

Наука
7 млн интересуются