Escopo variável em funções aninhadas

Alguém poderia explicar por que o seguinte programa falha:

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()

com a mensagem:

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

Mas se eu simplesmente mudar a variávelx para uma 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()

com a saída

10
11
12
13
14
15
16
17
18
19

A razão pela qual estou confuso é, se def() não pode acessarx, porque se torna acessível sex é uma matriz?

Obrigado.

questionAnswers(4)

yourAnswerToTheQuestion