Dans Python 3, l'accès aux variables de classe à partir d'une compréhension de liste dans la définition de classe n'est pas autorisé en raison de la portée limites. La portée de la classe n'est pas considérée comme une portée de recherche valide pour les variables utilisées dans la compréhension de la liste.
class Foo: x = 5 y = [x for i in range(1)]
Ce code générerait une erreur NameError : le nom 'x' n'est pas défini en Python 3.
Python suit des règles strictes règles de portée, et la portée de la classe est distincte de la portée des fonctions, des boucles et des compréhensions. Les compressions s'exécutent toujours dans leur propre portée, qui inclut toutes les variables déclarées dans la compréhension elle-même.
Dans Python 2, ce n'était pas un problème car les compréhensions de liste étaient implémentées à l'aide d'un raccourci permettant d'accéder à la portée de la classe englobante. Cependant, ce comportement a été considéré comme une incohérence et a été modifié dans Python 3 pour appliquer une portée appropriée.
Bien que l'itérable le plus interne d'une compréhension de liste ne puisse pas accéder aux variables de classe, l'expression itérable la plus externe peut. En effet, l'itérable le plus externe est évalué dans la portée environnante :
class Foo: x = 5 y = [i for i in range(x)] # This works fine
Fonction explicite :
Créez une fonction dans le classe qui a accès aux variables de classe et utilise une liste compréhension :
class Foo: x = 5 def get_y(self): return self.x, [x for i in range(self.x)]
Variable d'instance :
Initialiser une variable d'instance dans le constructeur à l'aide d'une compréhension de liste :
class Foo: def __init__(self): self.y = [self.x for i in range(1)]
Variable globale :
Déclarez la variable en dehors de la classe et utilisez dans la compréhension de la liste :
x = 5 class Foo: y = [x for i in range(1)]
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!