В С вы можете сами управлять тем, где у вас скалярные значения, а где указатели. В python для того что бы сделать язык проще и решили спрятать понятие указателя от разработчика. И для этого сделали указателями все. Любая переменная - указатель. А значит изменять скалярный по природе объект по указателю нельзя, так как могут быть другие переменные ссылающиеся на тот же объект. Отсюда получили два эффекта, во первых обращение к любой переменной медленнее чем могло бы быть. Во вторых да, использование памяти в какие то моменты времени может быть выше. Но в отличие от C python сам следит за использованием памяти. Разработчику в большинстве случаев не надо об этом задумываться и освобождать память от ненужных объектов. Когда на какой нибудь объект не ссылается ни одна переменная, то сборщик мусора этот объект удаляет через некоторое время.
Очень может быть, что для небольших чисел объекты есть всегда. Если же использовать числа большего размера, то можно обнаружить другое поведение:
>>> a=590
>>> id(a)
140274437545744 # Объект 590 размещен в памяти
>>> a+=1
>>> id(a)
140274437545904 # 591 находится в новой области памяти
>>> a+=1
>>> id(a)
140274437545744 # 590 уже был удален сборщиком мусора и его адрес использован для 592
>>> a-=2
>>> id(a)
140274437545904 # Там где был 591 теперь 590
>>> a
590 # В чем можно убедится