Питон видит, что ты присваиваешь start_id что-то, и решает что это локальная переменная. А потом понимает, что ты выше её читаешь, и ругается. Это намеренное поведение, так как в противном случае либо:
а) до присваивания бы читалось значение глобального start_id, а после - локального,
б) глобальная переменная всегда изменялась бы вместо локальной, и появление новой глобальной переменной с тем же именем что и локальная где-то в функции приводило бы к её неожиданному изменению.
И то и то неочевидно и могло бы привести к "молчаливому"(без исключений) но неправильному поведению программы.
Если не присваивать, то локальной переменной start_id не существует, и чтение осуществляется из глобальной.
Если так надо менять глобальную переменную, то явно пропиши её в начале функции как global start_id.
А лучше не используй глобальные переменные без нужды. Если их более одной, стоит переделать это в класс.