Python id() функция возвращает “идентификатор” объекта. Идентификатор объекта – это целое число, которое гарантированно уникально и постоянно для данного объекта в течение его жизни. У двух объектов с неперекрывающимися временами жизни может быть одинаковое значение id(). В реализации CPython это адрес объекта в памяти.
Python id()
Python кэширует значение id() для часто используемых типов данных, таких как строка, целое число, кортежи и так далее. Так что вы можете обнаружить, что несколько переменных ссылаются на один и тот же объект и имеют одинаковое значение id(), если их значения одинаковы. Давайте проверим это на примере.
# целые числа
a = 10
b = 10
c = 11
d = 12
print(id(a))
print(id(b))
print(id(c))
print(id(d))
Вывод:
4317900064
4317900064
4317900096
4317900128
Обратите внимание, что значение id() для ‘a’ и ‘b’ одинаково, у них одинаковое целочисленное значение. Давайте посмотрим, получим ли мы аналогичное поведение с строками и кортежами тоже?
# tuples
t = ('A', 'B')
print(id(t))
t1 = ('A', 'B')
print(id(t1))
# strings
s1 = 'ABC'
s2 = 'ABC'
print(id(s1))
print(id(s2))
Вывод:
4320130056
4320130056
4320080816
4320080816
Из вывода ясно, что Python кэширует строки и объекты кортежей, используя их для экономии места в памяти.
Кэширование может работать только с неизменяемыми объектами, обратите внимание, что целые числа, строки, кортежи являются неизменяемыми. Таким образом, реализация Python может использовать кэширование для экономии места в памяти и повышения производительности.
Мы знаем, что словарь не является неизменным. Давайте посмотрим, будет ли разный id() для разных словарей, даже если элементы одинаковы?
# dict
d1 = {"A": 1, "B": 2}
d2 = {"A": 1, "B": 2}
print(id(d1))
print(id(d2))
Вывод:
4519884624
4519884768
Как мы и предполагали, объекты словаря возвращают разные значения id(), и здесь, кажется, нет кэширования.
Python id() для пользовательского объекта
Давайте рассмотрим простой пример получения значения id() для пользовательского объекта.
class Emp:
a = 0
e1 = Emp()
e2 = Emp()
print(id(e1))
print(id(e2))
Вывод:
4520251744
4520251856
Резюме
Значение id() в Python гарантировано уникально и постоянно для объекта. Мы можем использовать это, чтобы удостовериться, указывают ли два объекта на один и тот же объект в памяти или нет.
Вы можете ознакомиться с полным скриптом на Python и другими примерами на Python в нашем репозитории GitHub.
Ссылка: Официальная документация
Source:
https://www.digitalocean.com/community/tutorials/python-id