Ámbito variable en funciones anidadas.

Alguien podría explicar por qué el siguiente programa falla:

def g(f):
  for _ in range(10):
    f()

def main():
  x = 10
  def f():
    print x
    x = x + 1
  g(f)

if __name__ == '__main__':
  main()

con el mensaje:

Traceback (most recent call last):
  File "a.py", line 13, in <module>
    main()
  File "a.py", line 10, in main
    g(f)
  File "a.py", line 3, in g
    f()
  File "a.py", line 8, in f
    print x
UnboundLocalError: local variable 'x' referenced before assignment

Pero si simplemente cambio la variablex a una matriz, funciona:

def g(f):
  for _ in range(10):
    f()

def main():
  x = [10]
  def f():
    print x[0]
    x[0] = x[0] + 1
  g(f)

if __name__ == '__main__':
  main()

con la salida

10
11
12
13
14
15
16
17
18
19

La razón por la que estoy confundido es, si def() no puede accederx, por qué se vuelve accesible six es una matriz?

Gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta