In Python 3 ist der Zugriff auf Klassenvariablen aus einem Listenverständnis innerhalb der Klassendefinition aufgrund des Gültigkeitsbereichs nicht zulässig Einschränkungen. Der Klassenbereich gilt nicht als gültiger Suchbereich für Variablen, die im Listenverständnis verwendet werden.
class Foo: x = 5 y = [x for i in range(1)]
Dieser Code würde einen NameError auslösen: Name 'x' ist nicht definiert in Python 3.
Python folgt einem strikten Scoping Regeln, und der Klassenbereich ist vom Bereich der Funktionen, Schleifen und Verständnisse getrennt. Komprimierungen werden immer in ihrem eigenen Bereich ausgeführt, der alle innerhalb der Komprehension selbst deklarierten Variablen einschließt.
In Python 2 war dies kein Problem, da Listenkomprimierungen mithilfe einer Verknüpfung implementiert wurden, die den Zugriff auf den umschließenden Klassenbereich ermöglichte. Dieses Verhalten wurde jedoch als Inkonsistenz angesehen und in Python 3 geändert, um eine ordnungsgemäße Festlegung des Gültigkeitsbereichs zu erzwingen.
Während die innerste Iterable eines Listenverständnisses nicht auf Klassenvariablen zugreifen kann, Der äußerste iterierbare Ausdruck kann. Dies liegt daran, dass das äußerste Iterable im umgebenden Bereich ausgewertet wird:
class Foo: x = 5 y = [i for i in range(x)] # This works fine
Explizite Funktion:
Erstellen Sie eine Funktion innerhalb des Klasse, die Zugriff auf Klassenvariablen hat und eine Liste verwendet Verständnis:
class Foo: x = 5 def get_y(self): return self.x, [x for i in range(self.x)]
Instanzvariable:
Initialisieren Sie eine Instanzvariable im Konstruktor mithilfe einer Liste Verständnis:
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
Globale Variable:
Deklarieren Sie die Variable außerhalb der Klasse und verwenden Sie sie es im Listenverständnis:
x = 5 class Foo: y = [x for i in range(1)]
Das obige ist der detaillierte Inhalt vonWarum kann ich in Python 3 List Comprehensions innerhalb einer Klassendefinition nicht direkt auf Klassenvariablen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!