nonlocal - Scoping in Python 'for' Schleifen




python scope (4)

Die wahrscheinlichste Antwort ist, dass sie einfach die Grammatik einfach hält, kein Hindernis für die Adoption war und viele waren froh darüber, dass sie den Geltungsbereich, zu dem ein Name gehört, nicht innerhalb eines Schleifenkonstrukts disambiguieren müssen. Variablen werden nicht in einem Bereich deklariert, sie werden durch die Position von Zuweisungsanweisungen impliziert. Das global Schlüsselwort existiert nur aus diesem Grund (um anzuzeigen, dass die Zuweisung in einem globalen Gültigkeitsbereich erfolgt).

Aktualisieren

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

Frühere Vorschläge, um für die Schleife lokale Variablen zu machen, sind auf das Problem des existierenden Codes gestoßen, der darauf beruht, dass die Schleifenvariable ihren Wert nach dem Verlassen der Schleife beibehält, und es scheint, dass dies als ein wünschenswertes Merkmal angesehen wird.

Kurz gesagt, Sie können es wahrscheinlich der Python-Community vorwerfen: P

Ich frage nicht nach Pythons Scoping-Regeln; Ich verstehe generell, wie Scoping in Python für Schleifen funktioniert. Meine Frage ist, warum die Designentscheidungen auf diese Weise getroffen wurden. Zum Beispiel (kein Wortspiel beabsichtigt):

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

Das obige wird drucken (9,2).

Das kommt mir seltsam vor: 'foo' kontrolliert nur die Schleife und 'bar' wurde innerhalb der Schleife definiert. Ich kann verstehen, warum es notwendig sein kann, dass 'bar' außerhalb der Schleife zugänglich ist (andernfalls hätten for-Schleifen eine sehr eingeschränkte Funktionalität). Was ich nicht verstehe ist, warum es notwendig ist, dass die Kontrollvariable nach dem Verlassen der Schleife im Bereich bleibt. Nach meiner Erfahrung wird der globale Namespace einfach unübersichtlich und es wird schwieriger, Fehler aufzuspüren, die von Interpretern in anderen Sprachen aufgefangen würden.


Ein wirklich nützlicher Fall dafür ist, wenn Sie enumerate und am Ende die Gesamtzahl erhalten möchten:

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

Ist das notwendig? Nein, aber es ist sicher bequem.

Eine andere Sache, auf die man achten sollte: In Python 2 sind auch Variablen in Listen-Comprehensions durchgesickert:

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

Das gleiche gilt jedoch nicht für Python 3.


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


Wenn die Variablen für Loops lokal wären, wären diese Loops für die meisten realen Programme nutzlos.

In der aktuellen Situation:

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

ergibt 45 . Betrachten wir nun, wie die Zuweisung in Python funktioniert. Wenn die Loop-Variablen streng lokal sind:

# 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 , weil die total innerhalb der Schleife nach der Zuweisung nicht die gleiche Variable wie die total außerhalb der Schleife ist. Dies wäre kein optimales oder erwartetes Verhalten.





scope