Почему статическое связывание работает по-разному для класса и функции?

В 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 "<pyshell#46>", line 1, in <module>
    f()
  File "<pyshell#45>", 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
<__main__.C instance at 0x00000000027CC9C8>

Поскольку определение класса является блоком кода, любое присвоение в этом блоке должно делать переменную локальной. Такx должен быть локальным для классаC, такy = x + 10 должно привести кUnboundLocalError, Почему нет такой ошибки?

Ответы на вопрос(1)

Ваш ответ на вопрос