Definiciones de funciones anidadas y alcance (UnboundLocalError)

Por qué el siguiente código no es válido:

def foo1(x=5):
    def bar():
        if x == 5:
            x = 6
        print(x)
    bar()

Mientras este código es válido:

def foo2(x=5):
    def bar():
        if x == 5:
            print('ok')
        print(x)
    bar()

foo2() hará exactamente lo que espera, perofoo1() dará unUnboundLocalError: local variable 'x' referenced before assignment en la líneaif x == 5:. ¿Por qué la modificación del valor de x más adelante en el código hace que este condicional no sea válido?

Respuestas a la pregunta(1)

Su respuesta a la pregunta