Why does this UnboundLocalError occur (closure)? [duplicate]
Почему возникает эта ошибка UnboundLocalError (закрытие)?
Что я здесь делаю не так?
counter = 0
defincrement(): counter += 1
increment()
Приведенный выше код выдает UnboundLocalError.
Переведено автоматически
Ответ 1
В Python нет объявлений переменных, поэтому он должен сам определять область действия переменных. Это происходит по простому правилу: если внутри функции есть присвоение переменной, эта переменная считается локальной.[1] Таким образом, строка
counter += 1
неявно делает counter local to increment(). Однако при попытке выполнить эту строку будет предпринята попытка прочитать значение локальной переменной counter до того, как оно будет присвоено, что приведет к UnboundLocalError.[2]
Если counter это глобальная переменная, то global ключевое слово поможет. Если increment() это локальная функция и counter локальная переменная, вы можете использовать nonlocal в Python 3.x.
Ответ 2
Вам нужно использовать глобальную инструкцию, чтобы изменять глобальную переменную counter , а не локальную переменную:
counter = 0
defincrement(): global counter counter += 1
increment()
Если охватывающая область, в которой counter определена, не является глобальной областью, в Python 3.x вы могли бы использовать нелокальный оператор. В аналогичной ситуации на Python 2.x у вас не было бы возможности переназначить нелокальное имя counter, поэтому вам нужно было бы сделать counter изменяемым и модифицировать его:
counter = [0]
defincrement(): counter[0] += 1
increment() print counter[0] # prints '1'
Ответ 3
Отвечая на вопрос в вашей теме письма, * да, в Python есть замыкания, за исключением того, что они применяются только внутри функции, а также (в Python 2.x) они доступны только для чтения; вы не можете повторно привязать имя к другому объекту (хотя, если объект изменяемый, вы можете изменять его содержимое). В Python 3.x вы можете использовать nonlocal ключевое слово для изменения переменной замыкания.