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
Libérer: 2024-12-23 22:51:10
original
850 Les gens l'ont consulté

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)]
Copier après la connexion

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)]
Copier après la connexion

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)]
Copier après la connexion

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)]
Copier après la connexion

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)]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal