← Назад к вопросам

Что такое функция id?

2.0 Middle🔥 111 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Функция id() в Python

id() — встроенная функция Python, которая возвращает уникальный идентификатор объекта в памяти. Это целое число, отражающее адрес объекта в оперативной памяти. Функция id() критична для понимания того, как Python работает с объектами и память.

Базовое определение

# Синтаксис
identifier = id(object)

# Примеры
a = 42
b = "hello"
c = [1, 2, 3]

print(id(a))         # Целое число: 140734854641144
print(id(b))         # Целое число: 140734854641272
print(id(c))         # Целое число: 140734854641400
print(type(id(a)))   # Тип: int

Важное свойство: Идентичность vs Равенство

# Равенство (==) vs Идентичность (is)
a = [1, 2, 3]
b = [1, 2, 3]
c = a

# a и b имеют одинаковые значения
print(a == b)       # True (равны)
print(id(a) == id(b))  # False (разные объекты)
print(a is b)       # False (не идентичны)

# a и c указывают на один объект
print(a == c)       # True (равны)
print(id(a) == id(c))  # True (один объект)
print(a is c)       # True (идентичны)

# Изменение через c влияет на a
c.append(4)
print(a)            # [1, 2, 3, 4]

Интернинг в Python

Python оптимизирует память для часто используемых объектов (целые числа, строки, None, True, False).

# Целые числа от -5 до 256 интернируются
x = 5
y = 5
print(x is y)       # True (один объект в памяти)
print(id(x) == id(y))  # True

# Целые числа > 256 могут не интернироваться
a = 257
b = 257
print(a is b)       # Может быть False

# Строки интернируются для оптимизации
s1 = "hello"
s2 = "hello"
print(s1 is s2)     # True
print(id(s1) == id(s2))  # True

# Но не всегда
s3 = "".join(["h", "e", "l", "l", "o"])
print(s1 is s3)     # False (создана динамически)

Практическое применение id() в Data Science

1. Обнаружение утечек памяти

import numpy as np
import gc

# Отслеживание объектов
objects_ids = set()

for i in range(1000):
    data = np.random.rand(1000, 1000)
    objects_ids.add(id(data))

print(f"Уникальных объектов: {len(objects_ids)}")
gc.collect()  # Сборка мусора

2. Проверка изменяемости объектов при передаче

import numpy as np

def modify_list(lst):
    lst.append(999)
    print(f"Inside function: id = {id(lst)}")

def modify_numpy(arr):
    arr[0] = 999
    print(f"Inside function: id = {id(arr)}")

# Список — изменяемый, передаётся по ссылке
my_list = [1, 2, 3]
print(f"Before: id = {id(my_list)}, data = {my_list}")
modify_list(my_list)
print(f"After: id = {id(my_list)}, data = {my_list}")

# NumPy массив — также изменяемый
my_array = np.array([1, 2, 3])
print(f"Before: id = {id(my_array)}, data = {my_array}")
modify_numpy(my_array)
print(f"After: id = {id(my_array)}, data = {my_array}")

3. Опасность mutable default arguments

def process_data(df=None):
    if df is None:
        df = []
    df.append(1)
    return df

result1 = process_data()
result2 = process_data()

print(f"result1: {result1}")
print(f"result2: {result2}")
print(f"Одинаковые id: {id(result1) == id(result2)}")

4. Отслеживание объектов в DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6]
})

# Отслеживание id элемента
print(f"id(df): {id(df)}")
print(f"id(df.values): {id(df.values)}")
print(f"id(df.copy()): {id(df.copy())}")

# После copy — другой объект
df_copy = df.copy()
df_copy.loc[0, "A"] = 999
print(f"df[A] unchanged: {df.loc[0, "A"]}")

Важные замечания

  1. ID зависит от реализации — в CPython это адрес в памяти
  2. ID не постоянен — после удаления объекта его id может быть переиспользован
  3. НЕ используй id для сравнения — используй is для идентичности, == для равенства
  4. Отладка памяти — id полезен для отслеживания утечек памяти
  5. Performance — в Data Science важно понимать копирование объектов

Лучшие практики

import sys

# Проверка размера объекта
data = list(range(1000))
print(f"Object id: {id(data)}")
print(f"Object size: {sys.getsizeof(data)} bytes")

# Отслеживание при отладке
objects_to_track = {}
objects_to_track["original"] = id(data)
objects_to_track["copy"] = id(data.copy())
objects_to_track["same_ref"] = id(data)

print(f"original == same_ref: {objects_to_track["original"] == objects_to_track["same_ref"]}")
print(f"original == copy: {objects_to_track["original"] == objects_to_track["copy"]}")

Понимание id() критично для избежания ошибок при работе с изменяемыми объектами в Python и Data Science.