все типы данных в питоне можно разделить на две большие группы - изменяемые и неизменяемый. так вот в случае неизменяемых типов, то есть строк, чисел, бул, кортежей и тд, питон на самом деле в целях экономии памяти создаст только один объект. вот идёт интерпретатор по программе видит x = 5, что он делает? находит свободную ячейку в памяти, берёт её адрес, говорит что x это вот этот адрес и кладёт туда 5. потом идёт дальше, видит y = 5, и думает ну я же вот у меня уже пятёрка в памяти есть, зачем я ещё одну создавать буду, говорит "и так сойдёт)" и просто игрику присваивает тот же адрес, что и иксу. то есть переменные в питоне это просто осмысленные, человекочитаемые шорткаты к адресу в памяти. в случае же с изменяемыми типами питон не может себе этого позволить, так как изменяя один объект мы бы изменили и другой, именно по этому для списков, множеств, словарей, классов это всё будут разные объекты