Maison >développement back-end >Tutoriel Python >Pourquoi ne puis-je pas accéder aux variables de classe directement à partir des compréhensions de liste dans Python 3 ?
Dans Python 2, l'accès aux variables de classe à partir d'une compréhension de liste dans la définition de classe était possible. Cependant, dans Python 3 et versions ultérieures, cela n'est pas autorisé en raison de restrictions de portée. La portée de la classe est traitée séparément de la portée des compréhensions et des autres fonctions et, par conséquent, l'accès aux variables de classe à partir d'une compréhension en utilisant des noms n'est pas autorisé.
Par exemple, le code suivant en Python 2 fonctionnerait :
class Foo: x = 5 y = [x for i in range(1)]
Cependant, en Python 3, cela entraînerait une erreur :
NameError: name 'x' is not defined
La raison de cette restriction est due à la façon dont Python gère les étendues. Lors de l’évaluation d’une compréhension de liste dans une définition de classe, Python crée une nouvelle portée pour cette compréhension. Cette nouvelle portée n'inclut pas la portée de la classe, donc toutes les variables définies dans la portée de la classe ne sont pas visibles dans la compréhension.
Les compréhensions, les expressions génératrices et les fonctions lambda ont toutes leurs propres portées isolées, ce qui signifie qu'elles ne peuvent pas accéder directement aux variables à partir de la fonction englobante ou de la portée de la classe. Il s'agit d'une mesure de sécurité qui empêche les modifications involontaires des variables dans la portée englobante.
Il existe quelques solutions de contournement à cette restriction :
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()
Il est important de noter que même si ces solutions de contournement permettent vous pouvez accéder aux variables de classe à partir des compréhensions, elles introduisent une complexité supplémentaire à votre code. Réfléchissez attentivement à l'approche la plus adaptée à vos besoins spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!