Что происходит в памяти при увеличении значения переменной на единицу в Python
Что проверяют
Модель памяти Python: имена это ссылки, целые числа неизменяемы. Для работы с данными у вопроса есть второй слой: понимаете ли вы, почему поэлементный цикл в разы дороже векторной операции над тем же массивом.
Как отвечать
Разложите по шагам. x = 5 создаёт объект целого числа и связывает имя с ним. x += 1 не меняет этот объект: вычисляется новое значение, создаётся новый объект, имя переставляется на него. У прежнего объекта уменьшается счётчик ссылок, и при нуле память освобождается сразу, без участия сборщика циклических ссылок. Маленькие целые в основной реализации закешированы, поэтому опыты с id на числах вроде пяти вводят в заблуждение: совпадение идентификаторов там ничего не доказывает.
Добавьте про стоимость. У объекта есть заголовок со ссылкой на тип и счётчиком ссылок, а само число хранится набором машинных слов произвольной длины, поэтому питоновское целое весит десятки байт вместо четырёх или восьми.
Отсюда практический вывод, ради которого вопрос и задают на позиции по данным: цикл, увеличивающий миллионы питоновских чисел, тратит время на выделение объектов, проверку типов и диспетчеризацию, а не на арифметику. В массиве numpy числа лежат машинными в непрерывном буфере: arr += 1 меняет буфер на месте и новых объектов не создаёт, а arr = arr + 1 строит копию массива и удваивает пик памяти. На больших данных разница между этими двумя строками решающая.
Где спотыкаются
Держат в голове модель из языков, где переменная это ящик со значением. Из неё следует, что увеличение правит число на месте, и человек не может объяснить ни поведение id, ни то, почему присваивание списка двум именам даёт один объект.
Второе: строят выводы на экспериментах с id и оператором is. Числа до некоторой границы кешированы, одинаковые константы внутри одной функции могут оказаться одним объектом, и на этом рождается вера, что интерпретатор переиспользует объекты всегда.
Третье: переносят рассуждение про неизменяемость на массивы. У numpy операция с присваиванием работает на месте, а значит задевает все срезы того же буфера, и при несовпадении типов падает, тогда как обычное сложение молча повысит тип результата.