Если рассматривать всё не как присваивание, а как "связывание" имени переменной с объектом.
И подать саму запись присваивания в немного ином виде.
globals().__setitem__('int_text', int(input("it's just an instance, bro")) )
То можно всё представить как функцию, которой передаются нужные атрибуты.
Т.е. имя переменной, что мы передали, а так же объект который мы хотим присвоить, сначала находятся лишь на локальном уровне этой самой функции, пока она не вмещается в список гдобальных переменных.
Т.е., если всё рисовать в некой последовательности действий.
То сначала производится инициализация объектов, что переданы функции.
1) Передан атрибут в виде объекта строки - принято
2) Передаются атрибут в виде функции - ожидание результата. Как только получит результат от функций, пойдет дальше, или же не пойдёт в случае ошибки. И запустится функция присваивания.
3). В механике функции присваивания, имя переменной связывается с уже поданным на блюдичке объекте.
А вот с функциями содержащими рекурсию всё интереснее. К примеру, если написать x = x, не выйдет вызвать рекурсию, так как для начала нужно получить объект x. А вот если записать функцию, к примеру x = lambda: x(). Система сразу же может получить готовый объект функции. А так как его содержимое "инициализируется" лишь при непосредственном использовании. То когда мы уже используем саму функцию по имени переменной, то когда при выполнении функция встречает x(), она свободно выполняет её, так как имя переменной уже создано на локальном уровне, и связано с объектом.
И только после того, как полностью будет готов нужный объект, оно свяжет переменную с ним.
P.s. С реальностью не сильно сходится (имею ввиду представление всего, как функции), но механика похожая. Просто мне проще всё представлять как функции.