Á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&nbsp;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()&nbsp;no puede accederx, por qué se vuelve accesible six&nbsp;es una matriz?

Gracias.