Есть такой код:
#!/usr/bin/env python3
def func1():
arr = []
num = 0
def func2(v):
print(num)
# num += 1
arr.append(v)
return {'num': num, 'arr': arr}
return func2
f = func1()
print(f(10))
print(f(11))
print(f(12))
Как видите, одна строка закомментирована. Если её раскомментировать, то в консоли выводится ошибка:
UnboundLocalError: local variable 'num' referenced before assignment
Эта ошибка говорит о том, что я пытаюсь изменить значение переменной num, которая на этот момент ещё не объявлена.
Мне это не понятно, ведь переменная num объявлена во внешней области видимости. И вполне логично, что если она не находится в локальной области видимости, то будет искаться во внешней. Именно так и происходит с соседней переменной arr.
Так почему же num не может найтись во внешней области видимости, а arr может?
LIVE DEMO здесь:
https://ideone.com/Hk9YEn