Большая часть деталей дизайна языка Python записана в документах PEP — этот, кажется, охватывает правила, касающиеся отношений между именами переменных и областью действия: https://peps.python.org/pep-0227/#rebinding-names-in -окружающие-прицелы
Существуют технические проблемы, которые затрудняют поддержку повторной привязки имен в объемлющих областях, но основная причина, по которой это не разрешено в текущем предложении, заключается в том, что против этого выступает Гвидо. Его мотивация: это трудно поддерживать, потому что для этого потребуется новый механизм, который позволил бы программисту указать, что присваивание в блоке должно перепривязывать имя в охватывающем блоке; предположительно ключевое слово или специальный синтаксис (x := 3) сделали бы это возможным. Учитывая, что это будет стимулировать использование локальных переменных для хранения состояния, которое лучше хранить в экземпляре класса, не стоит добавлять новый синтаксис, чтобы сделать это возможным (по мнению Гвидо).
Прикрепляю к посту несколько видео по теме: