Heim > Backend-Entwicklung > Python-Tutorial > Warum kann ich in Python 3 List Comprehensions innerhalb einer Klassendefinition nicht direkt auf Klassenvariablen zugreifen?

Warum kann ich in Python 3 List Comprehensions innerhalb einer Klassendefinition nicht direkt auf Klassenvariablen zugreifen?

Susan Sarandon
Freigeben: 2024-12-27 13:59:14
Original
992 Leute haben es durchsucht

Why Can't I Access Class Variables Directly in Python 3 List Comprehensions Within a Class Definition?

Zugriff auf Klassenvariablen aus einem Listenverständnis in der Klassendefinition

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.

Fehlerbeispiel:

class Foo:
    x = 5
    y = [x for i in range(1)]
Nach dem Login kopieren

Dieser Code würde einen NameError auslösen: Name 'x' ist nicht definiert in Python 3.

Ursache: Scoping-Einschränkungen

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.

Ausnahme: Äußerste Iterable

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
Nach dem Login kopieren

Problemumgehungen:

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)]
Nach dem Login kopieren

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)]
Nach dem Login kopieren

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)]
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage