Zmienny zakres w zagnieżdżonych funkcjach

Czy ktoś mógłby wyjaśnić, dlaczego następujący program zawodzi:

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

z wiadomością:

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

Ale jeśli po prostu zmienię zmiennąx do tablicy, działa:

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

z wyjściem

10
11
12
13
14
15
16
17
18
19

Powodem, dla którego jestem zdezorientowany, jest skądf() nie może uzyskać dostępux, dlaczego staje się dostępny, jeślix jest tablicą?

Dzięki.

questionAnswers(4)

yourAnswerToTheQuestion