Maison >développement back-end >Tutoriel Python >Pourquoi 'example = list(...)' provoque-t-il une 'TypeError : l'objet 'list' n'est pas appelable' en Python ?
Objets en tant que noms : pourquoi "exemple = liste (...)" provoque "TypeError : l'objet 'list' n'est pas appelable"
Une erreur déroutante survient lors de la tentative d'utilisation du code "example = list('easyhoss')" dans une session Python interactive. Contrairement à l'attente du didacticiel selon laquelle « exemple » deviendrait une liste, cela entraîne une « TypeError : l'objet 'list' n'est pas appelable. »
Shadowing : The Puzzle Solver
La racine de ce problème réside dans l'observation du nom de la "liste" intégrée. Initialement, « liste » fait référence à une classe intégrée. Cependant, lorsque vous attribuez une valeur à « liste », vous créez une variable portant ce nom faisant référence à une instance de la liste.
Par exemple, si vous exécutez le code suivant :
example = list('easyhoss') list = list('abc') example = list('easyhoss') # Error: 'list' is now an instance
Vous changez effectivement la signification de « liste » d’une classe à une instance. Cela amène Python à donner la priorité à l'instance lors de la recherche du nom de la « liste », conduisant à « TypeError ».
Espaces de noms et portée : les concepts de base
Comprendre les espaces de noms et la définition de la portée est cruciale pour résoudre ce problème. Python organise les noms et leurs objets correspondants dans des espaces de noms, qui sont essentiellement des dictionnaires.
Python a une structure d'espace de noms hiérarchique. Lors de l'accès à un nom, Python vérifie d'abord l'espace de noms local. Si le nom n'est pas trouvé, il monte vers l'espace de noms supérieur suivant, jusqu'à ce qu'il épuise tous les espaces de noms et renvoie une NameError. Les fonctions et classes intégrées résident dans l'espace de noms le plus élevé, __builtins__.
Ombrage et résolution : un exemple
Considérez le code suivant :
example = list("abc") # Works fine list = list("abc") example = list("abc") # TypeError
Après avoir attribué une valeur à « liste », Python recherchera « liste » dans l'espace de noms local. Puisqu'il y trouve l'instance, il ne passera pas à l'espace de noms de niveau supérieur, ce qui entraînera l'erreur.
Éviter les pièges : bonnes pratiques
Pour éviter l'observation et garantir une fonctionnalité appropriée, il est conseillé d'utiliser un IDE qui met en évidence l'observation des noms. De plus, évitez de réattribuer les noms intégrés, car ils sont censés être partagés et accessibles tout au long du programme.
Explorations supplémentaires : classes, instances et appelables
Si vous souhaitez approfondir les classes, les instances et les appelables, reportez-vous à la documentation pour des explications complètes.
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!