UnboundLocalError пытается использовать переменную (предположительно глобальную), которая (пере)назначается (даже после Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 UnboundLocalError пытается использовать переменную (предположительно глобальную), которая (пере)назначается (даже после

Сообщение Anonymous »

Когда я пробую этот код:

Код: Выделить всё

a, b, c = (1, 2, 3)

def test():
print(a)
print(b)
print(c)
c += 1
test()
Я получаю сообщение об ошибке в строке print(c):

Код: Выделить всё

UnboundLocalError: local variable 'c' referenced before assignment
или в некоторых более старых версиях:

Код: Выделить всё

UnboundLocalError: 'c' not assigned
Если я закомментирую c += 1, все печати будут успешными.
Я не понять: почему печать a и b работает, а c — нет? Как c += 1 привел к сбою print(c), даже если он используется позже в коде?
Похоже, что присваивание c += 1 создает локальную переменную c, которая имеет приоритет над глобальной переменной c. Но как переменная может «украсть» область видимости до того, как она существует? Почему c здесь явно локальный?

См. также Как использовать глобальную переменную в функции? на вопросы, которые просто о том, как переназначить глобальную переменную изнутри функции, и можно ли изменить переменную в Python, которая находится во внешней (охватывающей), но не глобальной области? для переназначения из охватывающей функции (замыкания).
См. Почему не требуется ключевое слово global для доступа к глобальной переменной? для случаев, когда OP ожидал ошибки, но не получил ее, из-за простого доступа к глобальному значению без ключевого слова global.
См. Как можно «отвязать» имя в Python? Какой код может вызвать ошибку UnboundLocalError? для случаев, когда OP ожидал, что переменная будет локальной, но имеет логическую ошибку, которая предотвращает присвоение в каждом случае.
См. Как Может ли «NameError: свободная переменная 'var', на которую ссылаются перед присвоением в охватывающей области», возникнуть в реальном коде? для связанной проблемы, вызванной ключевым словом del.

Подробнее здесь: https://stackoverflow.com/questions/370 ... hat-is-rea
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»