@zlodiak

Почему переменная не ищется во внешней области видимости?

Есть такой код:
#!/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
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
longclaps
@longclaps
Сперва нужно разобраться с тем, что такое mutable и immutable
Затем - с декларациями global и nonlocal.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@BJlaDuMup
def func1():
    arr = []
    num = 0
 
    def func2(v):
      nonlocal num
      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))
Ответ написан
@Norkotik
Похоже на попытку удалить гланды одного пациента, через ж. другого.
Если этот код используется для исследования python, то нужно смотреть в первоначальную задачу, а так лучше почитать про области видимости, и вопрос отпадет. В данной ситуации не понятно какую цель автор преследует, что дать совет/решение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы