Python id()

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