раздел 01 · подстраница 1
Когда памяти достаточно
Может показаться, что раз данные в переменной исчезают, то это «плохой» способ. Это не так. Огромная часть кода работает именно с памятью, и тащить туда файл или базу было бы лишней сложностью. Разберём, когда переменной хватает с головой.
Случай 1: промежуточные вычисления
Вы загрузили данные, что-то с ними посчитали, отдали результат. Промежуточные значения хранить незачем - они нужны на доли секунды.
prices = [120, 340, 90, 500]
total = sum(prices) # переменная-итог, живёт пару строк
average = total / len(prices)
print(f"Итого: {total}, в среднем: {average}")
Сохранять total и average в файл бессмысленно - при следующем запуске их легко пересчитать.
Случай 2: данные только что откуда-то приехали
Вы запросили данные у API или прочитали файл. Они уже хранятся надёжно - в источнике. В переменной у вас рабочая копия на время обработки.
// данные хранятся на сервере, в памяти - временная копия для отрисовки
const response = await fetch("/api/tasks");
const tasks = await response.json(); // живёт, пока открыта страница
renderTasks(tasks);
Постоянное хранилище здесь - сервер. Переменная tasks - просто то, с чем работает страница прямо сейчас.
Случай 3: состояние интерфейса
Какая вкладка активна, открыто ли модальное окно, что пользователь набрал в поле поиска. Это состояние имеет смысл только пока страница открыта. Сбросилось при перезагрузке - и хорошо.
Случай 4: кэш на время сессии
Иногда данные дорого получать (медленный запрос, тяжёлый расчёт). Тогда результат держат в памяти, чтобы не делать работу дважды.
cache = {}
def get_user(user_id):
if user_id in cache: # уже считали - берём из памяти
return cache[user_id]
user = slow_database_query(user_id)
cache[user_id] = user # запомнили на время работы программы
return user
При перезапуске кэш потеряется - и это нормально, он наполнится заново. Кэш по определению одноразовый.
Граница: когда памяти уже мало
Переходите к файлу или базе, как только появляется хоть одно из:
- данные должны быть на месте после перезапуска (список задач, профиль, настройки);
- их вводит пользователь и ждёт, что они сохранятся;
- к ним нужен доступ из другого запуска программы или с другого устройства;
- их слишком много, чтобы держать всё в памяти разом.
Антипаттерны
- Сохранять в файл то, что легко пересчитать. Лишние записи на диск, лишний код, рассинхрон. Если значение выводится из других данных - храните исходные, а это считайте на лету.
- Бояться переменных. Новички иногда сразу лезут в базу «чтобы по-взрослому». В половине случаев простая переменная честнее и понятнее.