Ich frage nicht nach Pythons Scoping-Regeln. Ich verstehe allgemein, wie das Scoping in Python für Schleifen funktioniert. Meine Frage ist, warum die Entwurfsentscheidungen auf diese Weise getroffen wurden. Zum Beispiel (kein Wortspiel beabsichtigt):
for foo in xrange(10):
bar = 2
print(foo, bar)
Das obige wird gedruckt (9,2).
Das kommt mir komisch vor: 'foo' steuert wirklich nur die Schleife, und 'bar' wurde innerhalb der Schleife definiert. Ich kann verstehen, warum es möglicherweise erforderlich ist, dass 'bar' außerhalb der Schleife zugänglich ist (andernfalls hätten Schleifen nur eine sehr eingeschränkte Funktionalität). Was ich nicht verstehe, ist, warum die Steuervariable nach dem Beenden der Schleife im Gültigkeitsbereich bleiben muss. Nach meiner Erfahrung ist der globale Namespace einfach unübersichtlich und es ist schwieriger, Fehler aufzuspüren, die von Dolmetschern in anderen Sprachen abgefangen würden.
for
Schleife Ihren globalen Namespace überfüllt, schließen Sie sie in eine Funktion ein. Schließungen in Hülle und Fülle!Antworten:
Die wahrscheinlichste Antwort ist, dass es nur die Grammatik einfach hält, kein Stolperstein für die Annahme war und viele glücklich waren, den Umfang, zu dem ein Name gehört, nicht eindeutig definieren zu müssen, wenn sie ihm innerhalb eines Schleifenkonstrukts zugewiesen werden. Variablen werden nicht innerhalb eines Bereichs deklariert, sondern durch den Speicherort von Zuweisungsanweisungen impliziert. Das
global
Schlüsselwort existiert nur aus diesem Grund (um anzuzeigen, dass die Zuweisung in einem globalen Bereich erfolgt).Aktualisieren
Hier ist eine gute Diskussion zum Thema: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
Kurz gesagt, Sie können wahrscheinlich die Python-Community dafür verantwortlich machen: P.
quelle
Python hat keine Blöcke, ebenso wie einige andere Sprachen (wie C / C ++ oder Java). Daher ist die Scoping-Einheit in Python eine Funktion.
quelle
for
Schleifen eine natürliche Erweiterung eines allgemeinen Prinzips. In Python müsste es ein Sonderfall sein, und Sonderfälle sollten vermieden werden, es sei denn, sie haben überzeugende Vorteile.Ein wirklich nützlicher Fall hierfür ist die Verwendung
enumerate
und Sie möchten am Ende die Gesamtzahl:Ist das notwendig? Nein, aber es ist sicher bequem.
Eine andere Sache, die Sie beachten sollten: In Python 2 werden auch Variablen im Listenverständnis durchgesickert:
Gleiches gilt jedoch nicht für Python 3.
quelle
else
Klausel tun können , dh.else: print "I did something {0} times".format(count)
- bevor der lokale Bereich (der in Python nicht vorhanden ist) verschwindetsomeiterator
es leer ist?else
in diesem Fall eine Klausel verwendet werden könnte, würde sie im Allgemeinen nicht funktionieren, da der Schleifenkörperbreak
vorzeitig funktionieren könnte .Wenn Sie eine break-Anweisung in der Schleife haben (und den Iterationswert später verwenden möchten, um möglicherweise etwas abzurufen, zu indizieren oder den Status anzugeben), werden Ihnen eine Codezeile und eine Zuweisung erspart, sodass Sie bequem arbeiten können.
quelle
Einer der wichtigsten Einflüsse für Python ist ABC , eine in den Niederlanden entwickelte Sprache, um Anfängern Programmierkonzepte beizubringen. Der Schöpfer von Python, Guido van Rossum, arbeitete in den 1980er Jahren mehrere Jahre an ABC. Ich weiß fast nichts über ABC, aber da es für Anfänger gedacht ist, muss es vermutlich eine begrenzte Anzahl von Bereichen haben, ähnlich wie bei frühen BASICs.
quelle
Wenn Variablen für Schleifen lokal wären, wären diese Schleifen für die meisten realen Programme nutzlos.
In der aktuellen Situation:
ergibt
45
. Überlegen Sie nun, wie die Zuweisung in Python funktioniert. Wenn Schleifenvariablen streng lokal wären:ergibt
0
, weiltotal
innerhalb der Schleife nach der Zuweisung nicht die gleiche Variable wietotal
außerhalb der Schleife ist. Dies wäre kein optimales oder erwartetes Verhalten.quelle
total
undfoo
hätte immer noch schleifenlokale Bindungen im OP-Szenario und die Logik ist dieselbe.