Ошибка области видимости переменной Python - PullRequest
190 голосов
/ 16 декабря 2008

Следующий код работает как положено в Python 2.5 и 3.0:

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

print(a, b, c)

def test():
    print(a)
    print(b)
    print(c)    # (A)
    #c+=1       # (B)
test()

Однако, когда я раскомментирую строку (B) , я получаю UnboundLocalError: 'c' not assigned в строке (A) . Значения a и b напечатаны правильно. Это полностью сбило меня с толку по двум причинам:

  1. Почему в строке (A) возникает ошибка времени выполнения из-за более позднего оператора в строке (B) ?

  2. Почему переменные a и b печатаются как положено, а c вызывает ошибку?

Единственное объяснение, которое я могу придумать, состоит в том, что локальная переменная c создается присваиванием c+=1, которое имеет прецедент над "глобальной" переменной c даже перед локальной переменная создана. Конечно, для переменной не имеет смысла «красть» область видимости до того, как она существует.

Может кто-нибудь объяснить это поведение?

Ответы [ 11 ]

0 голосов
/ 11 января 2019

В python у нас есть аналогичное объявление для всех типов переменных: локальные, переменные класса и глобальные переменные. когда вы ссылаетесь на глобальную переменную из метода, python думает, что вы на самом деле ссылаетесь на переменную из самого метода, который еще не определен, и, следовательно, выдает ошибку. Для ссылки на глобальную переменную мы должны использовать Глобал () [ 'имяПеременной'].

в вашем случае используйте вместо a, b и c соответственно globals () ['a], globals () [' b '] и globals () [' c '].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...