Warum funktioniert die statische Bindung für Klasse und Funktion anders?

In Python (getestet auf 2.7.6) sind alle Variablen beim Kompilieren statisch an einen Gültigkeitsbereich gebunden. Dieser Vorgang ist in gut beschriebenhttp://www.python.org/dev/peps/pep-0227/ undhttp://docs.python.org/2.7/reference/executionmodel.html

Es wird ausdrücklich angegeben, dass "Wenn eine Namensbindungsoperation irgendwo innerhalb eines Codeblocks auftritt, werden alle Verwendungen des Namens innerhalb des Blocks als Verweise auf den aktuellen Block behandelt."

Eine Funktion ist ein Codeblock, daher schlägt der folgende Code fehlx wird nach seiner Verwendung zugewiesen (daher wird es zur Kompilierungszeit lokal definiert, weil es irgendwo in der Funktion zugewiesen wird, aber zur Ausführungszeit wird es verwendet, bevor es gebunden wird).

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

Eine Klasse ist auch ein Codeblock, daher sollten wir genau dasselbe Verhalten beobachten. Aber das beobachte ich nicht. Schauen Sie sich dieses Beispiel an:

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>

Da die Klassendefinition ein Codeblock ist, sollte bei jeder Zuweisung innerhalb dieses Blocks die Variable lokal sein. Sox sollte lokal für die Klasse seinC, soy = x + 10 sollte zu einem führenUnboundLocalError. Warum gibt es keinen solchen Fehler?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage