Maison >développement back-end >Tutoriel Python >Pourquoi les compréhensions de liste Python 3 ne peuvent-elles pas accéder directement aux variables de classe ?

Pourquoi les compréhensions de liste Python 3 ne peuvent-elles pas accéder directement aux variables de classe ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 22:51:10967parcourir

Why Can't Python 3 List Comprehensions Directly Access Class Variables?

Accès aux variables de classe à partir des compréhensions de liste

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.

Exemple d'erreur

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.

Portée de la classe et List/Set/Dict Compréhensions

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.

Solutions de contournement

Malgré la restriction, il existe des solutions de contournement pour accéder aux variables de classe à partir des compréhensions :

1 . Portée explicite

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)]

2. Variables d'instance

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)]

3. Portée globale

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)]

Exception : itérable le plus externe

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn