Что делает функция id() в Python?

Ответ

Функция id(object) возвращает уникальный целочисленный идентификатор переданного объекта. В реализации CPython этот идентификатор соответствует адресу объекта в памяти.

Основные свойства:

  • Уникальность: Идентификатор уникален и постоянен для объекта в течение всего времени его жизни.
  • Сравнение: Оператор is проверяет, ссылаются ли две переменные на один и тот же объект в памяти, что эквивалентно сравнению их id().

Пример:

list_a = [1, 2, 3]
list_b = [1, 2, 3]
list_c = list_a  # list_c — это ссылка на тот же объект, что и list_a

print(id(list_a))  # Например, 140245678945600
print(id(list_b))  # Другой id, хотя значения одинаковы
print(id(list_c))  # Тот же id, что и у list_a

print(list_a is list_b)  # False (id разные)
print(list_a is list_c)  # True (id одинаковые)

Важно: Для небольших целых чисел и строк Python может использовать механизм интернирования (interning), когда одинаковые значения могут иметь один id, но на это не стоит полагаться в логике программы.

Ответ 18+ 🔞

Вот, смотри, объясняю на пальцах, как это работает. Функция id() — это, по сути, паспорт объекта в Питоне. Она выдает тебе уникальный числовой идентификатор этой штуки. А в CPython, если копнуть поглубже, этот номер — это просто адрес в оперативке, где этот объект лежит. Прямой перевод, ёпта.

Что важно запомнить, чтобы не облажаться:

  • Он уникальный и постоянный. Пока объект жив, его id не меняется. Умер объект — его номер может выдать другому. Как номер квартиры.
  • Оператор is — это и есть проверка по id. Когда ты пишешь a is b, ты по сути спрашиваешь: «А это один и тот же кусок памяти?» А не «А значения одинаковые?». Вот тут собака зарыта, чувак.

Смотри, как это на практике выглядит:

list_a = [1, 2, 3]
list_b = [1, 2, 3]  # Создал ДРУГОЙ список, хоть и с такими же цифрами
list_c = list_a     # А тут просто дал новое имя СТАРОМУ списку. Это не копия!

print(id(list_a))  # Допустим, напечатает 140245678945600
print(id(list_b))  # А вот это будет СОВСЕМ ДРУГОЙ номер! Хотя list_b выглядит так же.
print(id(list_c))  # А это будет ТОТ ЖЕ САМЫЙ номер, что и у list_a. Потому что это он и есть.

print(list_a is list_b)  # False (потому что id разные, это разные объекты!)
print(list_a is list_c)  # True (потому что id одинаковые, это один объект!)

А теперь главное, где все ебутся: Не надейся, что у одинаковых мелких циферок или коротких строк id всегда будут разными! Питон иногда хитрит и кеширует их (это называется интернирование). Может так выйти, что id(5) == id(5) будет True. Но это оптимизация внутри движка, а не гарантия языка. Полагаться на это в своей логике — верный путь в ад, доверия к такому поведению — ноль ебать. Всегда исходи из того, что это разные объекты, если ты их явно не скопировал.

Короче, id — это чтобы понять, одна ли это сущность в памяти или две одинаковые. Всё остальное — от лукавого.