Вне функции переменную объявлять global незачем, хотя в некоторых примерах так делают, но это бестолково. Внутри каждой функции, в таких случаях, нужно объявлять только тогда, когда присваиваешь ей значение. Если же переменная внутри функции юзается только для чтения, то объявлять не нужно, и так ясно, она ведь уже была создана, а вот в случае присваивания значения- другое дело, ведь внутри функции без особой инструкции создается локальная переменная, видимая лишь внутри этой функции, пусть даже с таким-же именем, как и глобальная в другом месте, но в разных пространствах имен. ------------- добавлено в 09.23: вообще эти global многие ненавидят. Вот ты можешь создать пустой класс class C: pass pss = C() # инстанс теперь можешь с ним работать: pss.state = 1, переменная pss.state не нуждается в инструкции global.