Je ne pose pas de questions sur les règles de portée de Python; Je comprends généralement comment la portée fonctionne en Python pour les boucles. Ma question est de savoir pourquoi les décisions de conception ont été prises de cette manière. Par exemple (sans jeu de mots):
for foo in xrange(10):
bar = 2
print(foo, bar)
Ce qui précède imprimera (9,2).
Cela me semble étrange: «foo» ne contrôle que la boucle, et «bar» a été défini à l'intérieur de la boucle. Je peux comprendre pourquoi il pourrait être nécessaire que «bar» soit accessible en dehors de la boucle (sinon, les boucles for auraient des fonctionnalités très limitées). 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 encombre simplement l'espace de noms global et rend plus difficile la recherche des erreurs qui seraient détectées par des interprètes dans d'autres langues.
for
boucle encombre votre espace de noms global, enveloppez-la dans une fonction. Des fermetures à gogo!Réponses:
La réponse la plus probable est que cela garde simplement la grammaire simple, n'a pas été une pierre d'achoppement pour l'adoption, et beaucoup ont été satisfaits de ne pas avoir à lever l'ambiguïté à laquelle appartient un nom lors de son attribution dans une construction de boucle. Les variables ne sont pas déclarées dans une portée, elles sont impliquées par l'emplacement des instructions d'affectation. Le
global
mot-clé existe uniquement pour cette raison (pour signifier que l'affectation est effectuée à une portée globale).Mettre à jour
Voici une bonne discussion sur le sujet: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
En bref, vous pouvez probablement le blâmer sur la communauté Python: P
la source
Python n'a pas de blocs, comme le font certains autres langages (tels que C / C ++ ou Java). Par conséquent, l'unité de portée en Python est une fonction.
la source
for
boucles de portée sont une extension naturelle d'un principe général. En Python, cela devrait être un cas spécial, et les cas spéciaux doivent être évités à moins qu'ils ne présentent des avantages convaincants.Un cas vraiment utile pour cela est lors de l'utilisation
enumerate
et vous voulez le nombre total à la fin:Est-ce nécessaire? Non, mais c'est pratique.
Une autre chose à savoir: dans Python 2, les variables dans les compréhensions de liste sont également divulguées:
Mais, la même chose ne s'applique pas à Python 3.
la source
else
article, c.-à-d.else: print "I did something {0} times".format(count)
- avant la disparition de la portée locale (qui n'existe pas en Python)someiterator
est vide?else
clause puisse être utilisée dans ce cas, elle ne fonctionnerait pas en général puisque le corps de la boucle pourraitbreak
prématurément.Si vous avez une instruction break dans la boucle (et que vous souhaitez utiliser la valeur d'itération plus tard, peut-être pour récupérer, indexer quelque chose ou donner un statut), cela vous permet d'économiser une ligne de code et une affectation, il y a donc une commodité.
la source
L'une des principales influences de Python est ABC , un langage développé aux Pays-Bas pour enseigner les concepts de programmation aux débutants. Le créateur de Python, Guido van Rossum, a travaillé sur ABC pendant plusieurs années dans les années 1980. Je ne sais presque rien sur ABC, mais comme il est destiné aux débutants, je suppose qu'il doit avoir un nombre limité de portées, un peu comme les premiers BASIC.
la source
Pour commencer, si les variables étaient locales aux boucles, ces boucles seraient inutiles pour la plupart des programmes du monde réel.
Dans la situation actuelle:
rendements
45
. Maintenant, considérez le fonctionnement de l'affectation en Python. Si les variables de boucle étaient strictement locales:cède
0
, cartotal
à l'intérieur de la boucle après l'affectation n'est pas la même variable qu'à l'total
extérieur de la boucle. Ce ne serait pas un comportement optimal ou attendu.la source
total
etfoo
aurait toujours des liaisons locales de boucle dans le scénario de l'OP et la logique est la même.