раздел 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

При перезапуске кэш потеряется - и это нормально, он наполнится заново. Кэш по определению одноразовый.

Граница: когда памяти уже мало

Переходите к файлу или базе, как только появляется хоть одно из:

  • данные должны быть на месте после перезапуска (список задач, профиль, настройки);
  • их вводит пользователь и ждёт, что они сохранятся;
  • к ним нужен доступ из другого запуска программы или с другого устройства;
  • их слишком много, чтобы держать всё в памяти разом.

Антипаттерны

  • Сохранять в файл то, что легко пересчитать. Лишние записи на диск, лишний код, рассинхрон. Если значение выводится из других данных - храните исходные, а это считайте на лету.
  • Бояться переменных. Новички иногда сразу лезут в базу «чтобы по-взрослому». В половине случаев простая переменная честнее и понятнее.