Heim >Backend-Entwicklung >Python-Tutorial >Warum kann ich in Python 3 nicht direkt über Listenverständnisse auf Klassenvariablen zugreifen?
In Python 2 war der Zugriff auf Klassenvariablen aus einem Listenverständnis innerhalb der Klassendefinition möglich. In Python 3 und höher ist dies jedoch aufgrund von Bereichseinschränkungen nicht zulässig. Der Klassenbereich wird getrennt vom Bereich von Comprehensions und anderen Funktionen behandelt. Daher ist der Zugriff auf Klassenvariablen innerhalb eines Comprehensions mithilfe von Namen nicht zulässig.
Zum Beispiel würde der folgende Code in Python 2 funktionieren :
class Foo: x = 5 y = [x for i in range(1)]
In Python 3 würde es jedoch zu einem Fehler führen:
NameError: name 'x' is not defined
Der Grund für diese Einschränkung liegt in der Art und Weise, wie Python mit Bereichen umgeht. Bei der Auswertung eines Listenverständnisses innerhalb einer Klassendefinition erstellt Python einen neuen Bereich für dieses Verständnis. Dieser neue Bereich umfasst nicht den Klassenbereich, sodass alle im Klassenbereich definierten Variablen im Verständnis nicht sichtbar sind.
Zusammenfassungen, Generatorausdrücke und Lambda-Funktionen haben alle ihre eigenen isolierten Bereiche, was bedeutet, dass dies nicht möglich ist Greifen Sie direkt über die umschließende Funktion oder den Klassenbereich auf Variablen zu. Dies ist eine Sicherheitsmaßnahme, die unbeabsichtigte Änderungen von Variablen im umschließenden Bereich verhindert.
Es gibt einige Problemumgehungen für diese Einschränkung:
class Foo: x = 5 def get_y(self, x): return [x for i in range(1)] y = get_y(x)
class Foo: x = 5 def get_y(): nonlocal x return [x for i in range(1)] y = get_y()
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
class Foo: x = 5 @classmethod def get_y(cls): y = [cls.x for i in range(1)] return y Foo.y = Foo.get_y()
Es ist Es ist wichtig zu beachten, dass diese Problemumgehungen Ihnen zwar den Zugriff auf Klassenvariablen aus dem Verständnis ermöglichen, aber Ihrem Code zusätzliche Komplexität verleihen. Überlegen Sie sorgfältig, welcher Ansatz für Ihre spezifischen Bedürfnisse am besten geeignet ist.
Das obige ist der detaillierte Inhalt vonWarum kann ich in Python 3 nicht direkt über Listenverständnisse auf Klassenvariablen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!