Sie sagen es selbst, dass mit liest gibt es keine Mehrdeutigkeit und mit schreibt es gibt. Daher benötigen Sie einen Mechanismus zum Lösen der Mehrdeutigkeit bei Schreibvorgängen.
Eine Option (möglicherweise tatsächlich von viel älteren Versionen von Python, IIRC verwendet) ist nur zu sagen, dass Schreibvorgänge immer zum lokalen Bereich gehen. Dann brauchen Sie kein Schlüsselwort global
und keine Mehrdeutigkeit. Aber dann können Sie überhaupt nicht in globale Variablen schreiben (ohne Dinge wie globals()
zu verwenden, um sie in einer Runde zu bekommen), also wäre das nicht großartig. Eine andere Option, die von Sprachen verwendet wird, die Variablen statisch deklarieren, besteht darin, für jeden Bereich mit der Sprachimplementierung zu kommunizieren, deren Namen lokal sind (die Sie in diesem Bereich deklarieren) und welche Namen global sind der Modulumfang). Da Python jedoch keine Variablen deklariert hat, funktioniert diese Lösung nicht.
Eine andere Option wäre, dass x = 3
nur dann einer lokalen Variablen zugewiesen wird, wenn in einem äußeren Bereich bereits ein Name mit dem Namen x
vorhanden ist. Scheint es würde intuitiv das Richtige tun? Es würde jedoch zu einigen ernsthaften Eckenfällen führen. Derzeit, wo x = 3
schreiben wird, wird statisch vom Parser bestimmt; Entweder gibt es keine global x
im selben Bereich und es ist ein lokaler Schreibvorgang, oder es gibt einen global x
und es ist ein globaler Schreibvorgang. Aber wenn das, was es tun wird, vom globalen Modulumfang abhängt, müssen Sie bis zur Laufzeit warten, um zu bestimmen, wohin der Schreibvorgang geht , was bedeutet, dass er zwischen Aufrufen einer Funktion wechseln kann. Denk darüber nach. Jedes Mal, wenn Sie in einem Modul eine globale Variable erstellen, ändern Sie das Verhalten aller Funktionen in dem Modul, das diesen Namen als lokalen Variablennamen verwendet hat. Führen Sie eine Berechnung des Modulumfangs durch, die tmp
als temporäre Variable verwendet, und verabschieden Sie sich mit tmp
in alle Funktionen im Modul. Und ich schaudere, um an die obskuren Fehler zu denken, die das Zuordnen eines Attributs zu einem Modul, das Sie importiert haben, und das anschließende Aufrufen einer Funktion von diesem Modul betreffen. Yuck.
Und eine weitere Option besteht darin, der Sprachimplementierung bei jeder Zuweisung mitzuteilen, ob sie lokal oder global sein soll. Damit ist Python gegangen. Da es einen vernünftigen Standard gibt, der fast alle Fälle abdeckt (in eine lokale Variable schreiben), haben wir eine lokale Zuweisung als Standard und markieren explizit globale Zuweisungen mit global
.
Es gibt eine Mehrdeutigkeit mit Zuweisungen, die einen Mechanismus zur Lösung benötigt. global
ist ein solcher Mechanismus. Es ist nicht das einzig mögliche, aber im Kontext von Python scheint es, dass alle alternativen Mechanismen schrecklich sind. Ich weiß nicht, welchen "besseren Grund" du suchst.
Um kleine Fehler zu verstecken? – Inverse