Так работают переменные в питоне.
Если переменная только читается в локальной области видимости (в вашем случае - внутри функции login()), то она будет искаться последовательно локально, в области видимости на уровень выше и так до глобальной.
Если в переменную идет запись в локальном скоупе, то она становится локальной (причем сразу, а не в момент записи). Это поведение меняется объявлением переменной global или nonlocal. Надеюсь, понятно написал (если что, об этом в интернете полно материалов,
например)
В вашем примере error_count в функции login() - локальная, т.к. внутри функции идет запись в нее. При этом вы пытаетесь читать из нее до записи (ибо
error_count += 1
суть
error_count = error_count+1
).