Почему статическое связывание работает по-разному для класса и функции?
В python (проверено на 2.7.6) все переменные статически связаны с областью видимости во время компиляции. Этот процесс хорошо описан вhttp://www.python.org/dev/peps/pep-0227/ а такжеhttp://docs.python.org/2.7/reference/executionmodel.html
Явно сказано, чтоЕсли операция связывания имени происходит где-либо в блоке кода, все варианты использования имени в блоке рассматриваются как ссылки на текущий блок ».
Функция является блоком кода, поэтому следующий код с ошибкой, потому чтоx
назначается после его использования (поэтому во время компиляции он определяется локальным, потому что он назначается где-то в функции, но во время выполнения он используется перед привязкой).
x = 1
def f():
print x
x = 2
print x
>>> f()
Traceback (most recent call last):
File "", line 1, in
f()
File "", line 2, in f
print x
UnboundLocalError: local variable 'x' referenced before assignment
Класс также является блоком кода, поэтому мы должны наблюдать точно такое же поведение. Но это не то, что я наблюдаю. Посмотрите на этот пример:
x = 1
class C():
y = x + 10
x = 2
def __init__(self):
print C.y
>>> C.x
2
>>> C.y
11
>>> C()
11
Поскольку определение класса является блоком кода, любое присвоение в этом блоке должно делать переменную локальной. Такx
должен быть локальным для классаC
, такy = x + 10
должно привести кUnboundLocalError
, Почему нет такой ошибки?