Грубо говоря в python сделано так, что одна и та же переменная внутри функции не может быть сначала глобальной, потом локальной. В момент компиляции интерпретатор "предполагает" какая переменная будет представлена как глобальная, а какая локальная. В момент выполнения функции интерпретатор уже знает какую переменную искать в каком пространстве имен. Переменная либо локальная, либо глобальная. В моём примере, когда происходит выполнение функции, встретив переменную a (print a), интерпретатор считает её уже локальной, хотя и не объявленной, поэтому и говорит: "эй дядя ты не хочешь сначала задать значение для переменной". Но если в функции только читается глобальная переменная, то и проблем не возникает. Предположительно, это сделано для оптимизации работы с пространствами имен. Иначе, приходилось бы делать лишние операции по поиску необходимой переменной в разных пространствах. Всем спасибо! :)