Warum gibt es einen Unterschied bei der Behandlung ungebundener lokaler Variablen in Funktionen und Klassen?Python

Python-Programme
Anonymous
 Warum gibt es einen Unterschied bei der Behandlung ungebundener lokaler Variablen in Funktionen und Klassen?

Post by Anonymous »

Beim Verweisen auf globale Variablen kann man erkennen, dass Funktionen und Klassen unterschiedlich damit umgehen. Das erste ist in Ordnung und das zweite verursacht einen Fehler:

Code: Select all

x = 10
class Foo():
x = x + 1

print(Foo.x)  # prints 11
Vs:

Code: Select all

x = 10
def faa():
x = x + 1

faa()  # raises UnboundLocalError
Im Python-Ausführungsmodell wird dies wie folgt beschrieben:

Eine Klassendefinition ist eine ausführbare Anweisung, die Namen verwenden und definieren kann. Diese Referenzen folgen den normalen Regeln für die Namensauflösung
mit der Ausnahme, dass ungebundene lokale Variablen im
globalen Namespace nachgeschlagen werden.

Aber warum?
Der einzige andere Hinweis, auf den ich gestoßen bin, ist dieser Bit:

Die Suite der Klasse wird dann in einem neuen Ausführungsrahmen ausgeführt (siehe
Abschnitt Benennung und Bindung) unter Verwendung eines neuen erstellter lokaler Namespace und
der ursprüngliche globale Namespace. (Normalerweise enthält die Suite nur
Funktionsdefinitionen.) Wenn die Suite der Klasse die Ausführung beendet, wird ihr
Ausführungsrahmen verworfen, aber ihr lokaler Namespace wird gespeichert. 4 Ein
Klassenobjekt wird dann unter Verwendung der Vererbungsliste für die Basis
Klassen und des gespeicherten lokalen Namespace für das Attributwörterbuch erstellt.

Was immer noch keine Erklärung dafür bietet, warum dies zur Folge haben sollte, dass ungebundene lokale Klassen im globalen Namespace nachgeschlagen werden.
Beide Links stammen aus dieser Antwort, die jedoch nicht näher auf das Warum eingeht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post