Обратите внимание, что если вы написали
def cba():
global_variable = 'b'
print(global_variable)
cba()
Не было бы исключения. Это потому, что, несмотря на название, global_variable
будет локальной переменной в области видимости функции. Любая переменная, которую вы назначаете в функции, является локальной, если вы явно не укажете это иначе.
В функции, когда вы обращаетесь к переменной (как-то используете ее значение, как, например, печатаете ее в этих примерах), python сначала ищет переменную в локальной области, а затем в глобальной области.
def xyz():
print(global_variable)
Получит доступ к глобальной переменной, например.
Когда python пытается скомпилировать вашу функцию, он видит, что global_variable
назначен, и поэтому пытается рассматривать его как локальный, но затем он пытается получить к нему доступ, прежде чем он будет определен в этой области.
Ключевое слово global
говорит python, что это имя следует рассматривать как ссылку на что-то в глобальной области видимости для этой функции, поэтому назначения изменяют глобальную переменную и не вводят новую переменную в локальную область.