Dans Python 3, les compréhensions de liste ne peuvent pas accéder directement aux variables de classe définies dans la définition de classe, car elles fonctionnent dans leur propre portée imbriquée. Ce comportement diffère de Python 2, où un tel accès était possible.
Le code suivant illustre le problème dans Python 3 :
class Foo: x = 5 y = [x for i in range(1)]
Ce code soulèvera une NameError pour x, car la compréhension de la liste ne peut pas accéder à la variable de classe.
Les compréhensions de listes, d'ensembles et de dictionnaires, ainsi que les expressions génératrices, fonctionnent dans une portée imbriquée qui n'hérite pas de la portée de la classe. En effet, ces compréhensions sont implémentées en tant que fonctions et exécutées dans une portée distincte.
Malgré la restriction, il existe des solutions de contournement pour accéder aux variables de classe à partir des compréhensions :
Créez une portée spécifique dans la définition de la classe pour contenir les variables nécessaires à la compréhension :
class Foo: x = 5 def __init__(self): y = [self.x for i in range(1)]
Utilisez plutôt les variables d'instance, en les initialisant dans le constructeur :
class Foo: def __init__(self): self.x = 5 self.y = [self.x for i in range(1)]
Si possible, déplacez les variables et la logique en dehors de la définition de la classe et utilisez la portée globale :
x = 5 class Foo: y = [x for i in range(1)]
Lors de l'accès direct aux variables de classe dans les compréhensions n'est pas possible, il y a une exception pour l'itérable le plus externe. L'expression qui détermine l'itérable le plus externe peut accéder aux variables de classe :
class Foo: x = 5 y = [i for i in range(x)]
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!