Комментарии (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"]}")
Важные замечания
- ID зависит от реализации — в CPython это адрес в памяти
- ID не постоянен — после удаления объекта его id может быть переиспользован
- НЕ используй id для сравнения — используй is для идентичности, == для равенства
- Отладка памяти — id полезен для отслеживания утечек памяти
- 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.