Область действия переменных во вложенных функциях

Может ли кто-нибудь объяснить, почему не работает следующая программа:

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

с сообщением:

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

Но если я просто поменяю переменнуюx к массиву, это работает:

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

с выходом

10
11
12
13
14
15
16
17
18
19

Причина, по которой я запутался, еслиf() он не может получить доступxпочему он становится доступным, еслиx такое массив?

Благодарю.

Ответы на вопрос(4)

Ваш ответ на вопрос