UnboundLocalError

Ето парче обикновен код:

x = 5
def bar():
    print(x)
bar() # 5

Нищо странно. Сега да добавим още един ред в края на bar:

x = 5
def bar():
    print(x)
    x += 1
bar() # UnboundLocalError: local variable 'x' referenced before assignment

Заради присвояването x е станала локална променлива, която засенчва глобалната. И тъй като се опитваме да изплзваме локалната променлива прекалено рано получаваме UnboundLocalError.

Правилния начин да се направи горното е чрез global:

x = 5
def bar():
    global x
    print(x)
    x += 1
bar() # 5
print(x) # 6

Изричното деклраиране е с цел да ви напомни, че променяте глобална променлива.

Примера е взет от python FAQ. Там ще намерите много други полезни неща.