Если я запустил следующий код:
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
для печати, отличное от использования его значения для назначения? Я просто не понимаю.