Je ne m'interroge pas sur les règles de délimitation du champ d'application de Python. comment Le scoping fonctionne dans les boucles for de Python. Ma question est la suivante pourquoi les décisions de conception ont été prises de cette manière. Par exemple (sans mauvais jeu de mots) :
for foo in xrange(10):
bar = 2
print(foo, bar)
L'exemple ci-dessus imprimera (9,2).
Cela me semble bizarre : 'foo' ne fait que contrôler la boucle, et 'bar' a été défini à l'intérieur de la boucle. Je peux comprendre pourquoi il est nécessaire que 'bar' soit accessible en dehors de la boucle (sinon, les boucles for auraient une fonctionnalité très limitée). Ce que je ne comprends pas, c'est pourquoi il est nécessaire que la variable de contrôle reste dans la portée après la sortie de la boucle. D'après mon expérience, cela ne fait qu'encombrer l'espace de noms global et rend plus difficile la recherche d'erreurs qui seraient détectées par les interprètes d'autres langues.
12 votes
Si vous ne voulez pas que le
for
pour éviter d'encombrer votre espace de noms global, intégrez-le dans une fonction. Des fermetures à gogo !31 votes
À moins que vous n'exécutiez une boucle dans l'espace de noms global (ce qui est peu courant), cela encombre un fichier de type local espace de noms.
4 votes
Si cela n'existait pas, comment continuer le traitement plus tard au point où vous vous êtes arrêté à l'intérieur de la boucle ? Il suffit de définir la variable de contrôle avant la boucle ?
14 votes
@endolith Ouais... Pourquoi ne pas l'exiger ?
1 votes
@StevenLu : parce que ce serait plus de travail pour peu ou pas de bénéfice ?
5 votes
Les gens vont préférer ce qu'ils ont l'habitude de faire. Je dirais que ce genre de choses nuit au codeur python qui s'habitue à ce genre de choses et qui doit passer par un processus douloureux pour passer à un autre langage. Pour le reste d'entre nous, c'est un joli petit raccourci, je suppose.
2 votes
@StevenLu : Donc nous ne devrions pas faire de beaux langages, parce qu'alors la douleur de passer à des langages plus merdiques est encore plus évidente ? :)
0 votes
Non, le fait de ne pas avoir à initialiser ces variables améliore Python et la plupart des gens seraient enclins à être d'accord avec cette affirmation.
2 votes
Cela me fait peur pour un langage qui, par ailleurs, utilise les espaces blancs comme un moyen "élégant" de gérer la portée. Cela me fait me demander si toutes mes variables "scopées" sont vraiment dans leur propre portée.
0 votes
Est-ce que cela est bon pour la mémoire ? Et si Python finit par s'en débarrasser, est-il sûr d'utiliser de telles variables dans tout le programme ?
0 votes
Je dois utiliser python après plus de 30 ans de c et c++. Il me semble que l'utilisation d'un grand nombre de petites fonctions (par exemple, une fonction par boucle) est le seul moyen d'éviter les maux de tête liés à la maintenance qui peuvent découler des règles de scoping.
1 votes
Cela m'a coûté en dommages réels pour un projet que j'ai fait avec Jupyter, qui avait une ligne du genre
for y in ys: plot(X, y)
dondey
a remplacé une variable d'étiquette précédente qui était utilisée plus bas0 votes
@endolith pouvez-vous s'il vous plaît élaborer, comment puis-je continuer le traitement plus tard au point que vous avez quitté à l'intérieur de la boucle ? Je veux utiliser l'indice laissé après la sortie de la boucle.
0 votes
@ShubhamAgrawal Alors il suffit d'utiliser l'indice après être sorti de la boucle.
0 votes
Désolé @endolith en fait, je viens de réaliser que je m'attendais à ce que la boucle conditionnelle fonctionne à partir de la boucle for, ce qui devrait être fait avec la boucle while en python, contrairement à java.