Maison > développement back-end > Tutoriel Python > Pourquoi ne puis-je pas accéder directement aux variables de classe dans les compréhensions de liste Python 3 dans une définition de classe ?

Pourquoi ne puis-je pas accéder directement aux variables de classe dans les compréhensions de liste Python 3 dans une définition de classe ?

Susan Sarandon
Libérer: 2024-12-27 13:59:14
original
992 Les gens l'ont consulté

Why Can't I Access Class Variables Directly in Python 3 List Comprehensions Within a Class Definition?

Accès aux variables de classe à partir d'une compréhension de liste dans la définition de classe

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.

Exemple d'erreur :

class Foo:
    x = 5
    y = [x for i in range(1)]
Copier après la connexion

Ce code générerait une erreur NameError : le nom 'x' n'est pas défini en Python 3.

Cause : Restrictions de portée

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.

Exception : itérable le plus externe

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

Solutions de contournement :

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

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

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