11 подписчиков
Управление памятью в Python [Часть 1.1]
Сегодня начинаем серию статей про управление памятью в Python. В первой части разберём основы: как Python управляет памятью, как работает сборщик мусора, и посмотрим на простых примерах, как это всё работает на практике.
## Как Python управляет памятью
Прежде чем погружаться в детали, важно понять базовую модель памяти в Python. В отличие от языков вроде C/C++, Python автоматически управляет памятью за нас. Но это не значит, что нам не нужно понимать, как это работает.
### Базовая модель памяти
В Python всё является объектами. Когда мы создаём переменную, происходит следующее:
x = dict()
1. Python выделяет память для объекта (в данном случае словаря)
2. Создаёт объект
3. Создаёт имя 'x' в текущей области видимости
4. Связывает имя с объектом (создаёт ссылку)
Важно понимать: переменные в Python - это не контейнеры для значений, а именно ссылки на объекты в памяти. Давайте посмотрим на это подробнее:
x = [1, 2, 3]
y = x
В этом случае мы не копируем список, а создаём новую ссылку на тот же самый объект. Функция id() в Python возвращает уникальный идентификатор объекта в памяти (фактически, его адрес в памяти). Это позволяет нам проверить, ссылаются ли разные переменные на один и тот же объект:
x = [1, 2, 3]
y = x
print(id(x)) # например, 140712834927872
print(id(y)) # то же самое число - это тот же объект
# Если мы изменим список через одну ссылку, изменения видны через другую
x.append(4)
print(y) # [1, 2, 3, 4]
# А вот если создать новый список - это будет другой объект
z = [1, 2, 3]
print(id(z)) # другой номер - это новый объект в памяти
Это важно понимать, особенно когда мы работаем с изменяемыми объектами (списками, словарями, множествами). Неправильное управление ссылками может привести к неожиданному поведению программы.
В следующей части поговорим о том, как Python оптимизирует использование памяти
1 минута
20 января