Scoping in Python 'für' Schleifen

Ich frage nicht nach Pythons Scoping Regeln! Ich verstehe allgemein, wie Scoping in Python für Loops funktioniert. Meine Frage ist, warum die Designentscheidungen auf diese Weise gemacht wurden. Zum Beispiel (kein Wortspiel beabsichtigt):

for foo in xrange(10): bar = 2 print(foo, bar) 

Das obige wird drucken (9,2).

Das schlägt mich so komisch: 'foo' ist wirklich nur die Steuerung der Schleife, und 'bar' wurde innerhalb der Schleife definiert. Ich kann verstehen, warum es notwendig sein könnte, dass "bar" außerhalb der Schleife zugänglich ist (sonst hätten Schleifen sehr eingeschränkte Funktionalität). Was ich nicht verstehe ist, warum es notwendig ist, dass die Steuervariable nach Ablauf der Loop-Leiste im Geltungsbereich bleibt. In meiner Erfahrung klopft es einfach den globalen Namensraum und macht es schwieriger, Fehler aufzuspüren, die von Interpreten in anderen Sprachen gefangen werden würden.

5 Solutions collect form web for “Scoping in Python 'für' Schleifen”

Die wahrste Antwort ist, dass es nur die Grammatik einfach hält, war nicht ein Stolperstein für die Adoption, und viele waren glücklich mit nicht zu disambiguieren den Umfang, zu dem ein Name gehört, wenn man ihm in einem Loop-Konstrukt zuzuordnen. Variablen werden nicht in einem Geltungsbereich deklariert, es wird durch den Ort der Zuweisungsanweisungen angedeutet Das global Schlüsselwort existiert gerade aus diesem Grund (um zu bedeuten, dass die Zuweisung im globalen Bereich erfolgt).

Aktualisieren

Hier ist eine gute Diskussion zum Thema: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

Bisherige Vorschläge, um for-Loop-Variablen lokal zu der Schleife zu machen, stolperten über das Problem des vorhandenen Codes, der auf der Loop-Variable basiert, die ihren Wert nach dem Beenden der Schleife beibehält, und es scheint, dass dies als ein wünschenswertes Merkmal angesehen wird.

Kurz gesagt, können Sie es wahrscheinlich auf die Python-Community beschuldigen: P

Python hat keine Blöcke, wie einige andere Sprachen (wie C / C ++ oder Java). Daher ist die Scoping-Einheit in Python eine Funktion.

Ein wirklich nützlicher Fall dafür ist bei der enumerate und Sie wollen die Gesamtzahl am Ende:

 for count, x in enumerate(someiterator): dosomething(count, x) print "I did something {0} times".format(count) 

Ist das notwendig Nein. Aber es ist sicherlich bequem.

Eine andere Sache zu beachten: In Python 2 sind auch Variablen im Listenverständnis ausgelaufen:

 >>> [x**2 for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> x 9 

Aber das gilt auch nicht für Python 3.

Für die Starter, wenn Variablen waren lokal zu Schleifen, diese Loops wäre nutzlos für die meisten realen Welt Programmierung.

In der aktuellen Situation:

 # Sum the values 0..9 total = 0 for foo in xrange(10): total = total + foo print total 

Ergibt 45 . Nun, überlegen Sie, wie die Zuordnung in Python funktioniert. Wenn Loop-Variablen streng lokal waren:

 # Sum the values 0..9? total = 0 for foo in xrange(10): # Create a new integer object with value "total + foo" and bind it to a new # loop-local variable named "total". total = total + foo print total 

Ergibt 0 , da die total innerhalb der Schleife nach der Zuordnung nicht die gleiche Variable wie die total außerhalb der Schleife ist. Das wäre kein optimales oder erwartungsvolles Verhalten.

Einer der primären Einflüsse für Python ist ABC, eine Sprache, die in den Niederlanden entwickelt wurde, um Programmierkonzepte für Anfänger zu unterrichten. Pythons Schöpfer, Guido van Rossum, arbeitete an ABC seit mehreren Jahren in den 1980er Jahren. Ich weiß fast nichts über ABC, aber wie es für Anfänger gedacht ist, nehme ich an, dass es eine begrenzte Anzahl von Scopes haben muss, ähnlich wie früh BASICs.

  • String mit 'f' Präfix in python-3.6
  • Warum erbt keine Unterfunktion den Bereich in Python?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • UnboundLocalError bei der Manipulation von Variablen ergibt inkonsistentes Verhalten
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Variable Bereiche in Python-Klassen
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python - Wie man eine globale Variable aus einer Funktion
  • Was bedeutet Umfang
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • Python ist die beste Programmiersprache der Welt.