Если я запустил следующий код:
x = 1
class Incr:
print(x)
x = x + 1
print(x)
print(x)
Он печатает:
1
2
1
Ладно, никаких проблем, это то, чего я ожидал. И если я сделаю следующее:
x = 1
class Incr:
global x
print(x)
x = x + 1
print(x)
print(x)
Он печатает:
1
2
2
И что я ожидал. Проблем нет.
Теперь, если я начну делать функцию инкремента следующим образом:
x = 1
def incr():
print(x)
incr()
Он печатает 1 так, как я ожидал. Я предполагаю, что он делает это, потому что он не может найти x в своей локальной области, поэтому он ищет свою охватывающую область и находит x там. Пока никаких проблем.
Теперь, если я делаю:
x = 1
def incr():
print(x)
x = x + 1
incr()
Это дает мне следующую ошибку в трассировке:
UnboundLocalError: локальная переменная 'x', указанная перед назначением.
Почему Python не просто ищет закрывающее пространство для x, когда он не может найти значение x для использования для назначения, как это сделал мой class Incr? Обратите внимание, что я не спрашиваю, как заставить эту функцию работать. Я знаю, что функция будет работать, если я сделаю следующее:
x = 1
def incr():
global x
print(x)
x = x + 1
print(x)
incr()
Это правильно напечатает:
1
2
так, как я ожидаю. Все, что я прошу, это то, что он не просто тянет x из охватывающей области, когда ключевое слово global отсутствует, как это было для моего класса выше. Почему интерпретатор чувствует необходимость сообщать об этом как UnboundLocalError, когда он ясно знает, что существует некоторый x. Поскольку функция была в состоянии читать значение x для печати, я знаю, что она имеет x как часть своей охватывающей области... поэтому почему это не работает так же, как пример класса?
Почему используется значение x для печати, отличное от использования его значения для назначения? Я просто не понимаю.