Heim Backend-Entwicklung Python-Tutorial Standardumfang und -abschlüsse in Python und Lua

Standardumfang und -abschlüsse in Python und Lua

Oct 19, 2016 pm 01:34 PM

Standardumfang

Ich habe vor einiger Zeit Lua gelernt und festgestellt, dass der Standardumfang von Lua dem von Python entgegengesetzt ist. Wenn Lua eine Variable definiert, ist der Standardbereich der Variablen nicht sehr genau. Wenn Lua eine Anweisung wie x = 1 ausführt, wird nur dann nach x gesucht, wenn dies nicht möglich ist find x Globale Variablen werden nur unter bestimmten Umständen definiert. Wenn Python eine Variable definiert, ist der Gültigkeitsbereich der Variablen standardmäßig lokal (aktueller Block). Darüber hinaus kann Lua lokale Variablen definieren, indem beim Definieren der Variablen das lokale Schlüsselwort vor der Variablen hinzugefügt wird. Python verfügt jedoch nicht über ein ähnliches Schlüsselwort und Python-Variablen können nur im aktuellen Block definiert werden.

Wir wissen, dass globale Variablen schlecht sind, lokale Variablen jedoch gut. Sie sollten versuchen, beim Schreiben von Programmen lokale Variablen zu verwenden. Daher dachte ich am Anfang, dass die Konvention von Python besser sei. Ihr Vorteil besteht darin, dass sie weniger Tipparbeit erfordert. Wenn ich Lua-Programme schreibe, sage ich in meinem Herzen immer: „Vergiss das Lokale nicht, vergiss das Lokale nicht.“ Manchmal gehen jedoch ein paar Dinge durch das Netz und verursachen magische Fehler.

Abschluss

Das erste Mal, dass mir das Problem des Standardbereichs von Python auffiel, war die Verwendung von Abschlüssen. In Bezug auf Abschlüsse gibt es einen Code im Lua-Tutorial:

function new_counter()
  local n = 0
  local function counter()
    n = n + 1
    return n
  end
  return counter
end
   
c1 = new_counter()
c2 = new_counter()
print(c1())  -- 打印1
print(c2())  -- 打印1
print(c1())  -- 打印2
print(c2())  -- 打印2
Nach dem Login kopieren

Die Essenz von Abschlüssen kann auf das Umgebungsmodell in Kapitel 3 von verwiesen werden SICP. Hier können Sie sich einfach vorstellen, dass die Funktion counter ein privates Mitglied n hat.

Jetzt kommt die Frage: Ich möchte Python verwenden, um einen Abschluss mit derselben Funktion zu implementieren?

Schreiben Sie zunächst den Lua-Code direkt in Python-Code um:

def new_counter():
  n = 0
  def counter():
    n = n + 1
    return n
  return counter
Nach dem Login kopieren

Zeile 4 greift auf die nicht zugewiesene Variable n zu. Der Grund für den Fehler liegt nicht darin, dass Python keine Schließungen unterstützt, sondern darin, dass die Zuweisungsoperation von Python nicht auf die Variable n der oberen Ebene zugreifen kann (tatsächlich betrachtet Python sie als Definition lokaler Variablen und nicht als Zuweisung). Lokale Variablen definieren und Zuweisungsoperationen in Python sind syntaktisch widersprüchlich, Python unterstützt einfach nur neu definierbare Definitionsanweisungen. Da der Standardbereich von Python lokal ist, geht Python davon aus, dass es sich um eine Variablendefinitionsoperation handelt, wenn das Programm bei n = n 1 ausgeführt wird. Daher erstellt es eine (nicht initialisierte) lokale Variable n – und überschreibt erfolgreich new_counter. Eine Ebene von n – und versucht es dann Weisen Sie n 1 zu, aber n ist nicht initialisiert, n 1 kann nicht berechnet werden, daher meldet das Programm einen Fehler.

Mit einem kleinen Trick können Sie die Funktion der Abschlusszuweisung umsetzen:


def new_counter():
  n = [0]
  def counter():
    n[0] = n[0] + 1
    return n[0]
  return counter
Nach dem Login kopieren

Hier Der Grund, warum n[0] = n[0] 1 nicht schief geht, ist, dass das Gleichheitszeichen hier eine andere Bedeutung hat als das Gleichheitszeichen in n = n 1 zuvor. n[0] = n[0] Das Gleichheitszeichen in 1 bedeutet, ein Attribut von n zu ändern. Tatsächlich ruft dieses Gleichheitszeichen letztendlich die Methode __setitem__ der Liste auf. Das Gleichheitszeichen in n = n 1 bedeutet, den Wert n 1 an das Symbol n in der aktuellen Umgebung zu binden (wenn Symbol n bereits in der aktuellen Umgebung vorhanden ist, überschreiben Sie es).

Noch ein Exkurs: Verdammt, ich muss es nicht so schreiben, es ist so hässlich. Wie auch immer, Python ist eine objektorientierte Sprache. Um einen Zähler zu implementieren, können Sie genauso gut eine Klasse schreiben.

Trennung von Definition und Zuweisung

Lassen Sie uns zunächst die Merkmale des Standardbereichs von Python und Lua zusammenfassen:

1. Der Standardbereich von Lua ist global Wenn Sie ein Programm schreiben, müssen Sie sich das Schlüsselwort local merken (es sei denn, Sie müssen wirklich eine globale Variable definieren, Sie werden nicht dazu aufgefordert, sondern warten einfach, bis der Fehler behoben ist).

2. Der Standardbereich von Python ist lokal, obwohl die mentale Belastung beim Schreiben eines Programms geringer ist, es verliert die Fähigkeit, Variablen auf höherer Ebene Werte zuzuweisen (dies kann jedoch geändert werden). Sprache verwirrender).

Es scheint, dass beide Standardbereiche Probleme haben? Persönlich denke ich, dass der Grund für die oben genannten Probleme darin liegt, dass Python und Lua die Trennung von Definition und Zuweisung nicht erkennen. In Python und Lua kann eine Anweisung wie x = 1 entweder eine Definition oder eine Zuweisung darstellen. Tatsächlich erkennen nicht nur diese beiden Sprachen, sondern auch viele Hochsprachen die Trennung von Definition und Zuweisung nicht. Definition und Zuordnung sind in ihrer Funktion ähnlich, unterscheiden sich jedoch im Wesentlichen.

Im Folgenden wird x = 1 als Beispiel verwendet, um die Definition und Zuweisung zu erläutern:

Die Definition bedeutet: Registrieren Sie das Symbol x in der aktuellen Umgebung und initialisieren Sie es auf 1. Wenn x bereits existiert, wird ein Fehler gemeldet (Neudefinition ist nicht erlaubt) oder überschrieben (Neudefinition ist erlaubt).

Zuweisung bedeutet: Ausgehend von der aktuellen Umgebung Schicht für Schicht nach oben suchen, bis das Symbol x zum ersten Mal gefunden wird, und seinen Wert auf 1 ändern. Wenn sie nicht gefunden werden kann, wird ein Fehler gemeldet (die Variable existiert nicht).

Jetzt modifizieren wir Python leicht, um die Trennung von Definition und Zuweisung zu erreichen: Verwenden Sie „:=", um die Definition anzugeben, und „=", um die Zuweisung anzuzeigen. Schreiben Sie dann das new_counter-Beispiel neu, das nicht ausgeführt werden kann (die Zuweisungsoperation in Python steht in Konflikt mit der Definition lokaler Variablen. Mit anderen Worten, Python verfügt tatsächlich über keine Zuweisungsoperation, daher müssen wir einfach alle „=“ durch „:="“ ersetzen. ) , sehen Sie, wo es falsch ist:

def new_counter():
  n := 0
  def counter():
    n := n + 1
    return n
  return counter
Nach dem Login kopieren

Es ist offensichtlich, warum dieses Programm falsch ist. Was wir in Zeile 4 wollen, ist eine Zuweisungsoperation, keine Definitionsoperation. Ändern Sie es in die richtige Schreibweise:

def new_counter():
  n := 0
  def counter():
    n = n + 1
    return n
  return counter
Nach dem Login kopieren

Auf diese Weise wird es korrekt ausgeführt (vorausgesetzt, es gibt eine modifizierte Version des Python-Interpreters XD).

Lassen Sie uns zum Schluss noch über Lua sprechen. Lua hat das Gefühl, dass die Trennung von Definition und Zuweisung bereits zur Hälfte geschafft ist. Die Gleichheitszeichenanweisung mit dem lokalen Schlüsselwort muss definiert werden. Das Problem ist die Gleichheitszeichenanweisung ohne lokale. Für diese Art von Anweisung geht Lua folgendermaßen vor: Versuchen Sie zunächst, die Zuweisung durchzuführen. Wenn die Zuweisung fehlschlägt (die Variable existiert nicht), definieren Sie die Variable in der äußersten Umgebung (globale Umgebung). Mit anderen Worten: Die Gleichheitszeichenanweisung ohne lokale Vermischung von Definition und Zuweisung. Wenn außerdem die Trennung von Definition und Zuweisung erreicht wird, besteht keine Notwendigkeit, die Frage des Standardbereichs zu berücksichtigen – alle Definitionen werden in der aktuellen Umgebung definiert und alle definieren lokale Variablen. Ich kann mir wirklich keinen Vorteil vorstellen, wenn man globale Variablen in einem Funktionskörper oder einem anderen Block definiert.


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer-Anfänger-Programmierbasis in Projekt- und problemorientierten Methoden? Apr 02, 2025 am 07:18 AM

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren? Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Wie kann man vom Browser vermeiden, wenn man überall Fiddler für das Lesen des Menschen in der Mitte verwendet? Apr 02, 2025 am 07:15 AM

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Was sind reguläre Ausdrücke? Was sind reguläre Ausdrücke? Mar 20, 2025 pm 06:25 PM

Regelmäßige Ausdrücke sind leistungsstarke Tools für Musteranpassung und Textmanipulation in der Programmierung, wodurch die Effizienz bei der Textverarbeitung in verschiedenen Anwendungen verbessert wird.

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen ohne Serving_forver () an? Apr 01, 2025 pm 10:51 PM

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Wie erstelle ich dynamisch ein Objekt über eine Zeichenfolge und rufe seine Methoden in Python auf? Apr 01, 2025 pm 11:18 PM

Wie erstellt in Python ein Objekt dynamisch über eine Zeichenfolge und ruft seine Methoden auf? Dies ist eine häufige Programmieranforderung, insbesondere wenn sie konfiguriert oder ausgeführt werden muss ...

Was sind einige beliebte Python -Bibliotheken und ihre Verwendung? Was sind einige beliebte Python -Bibliotheken und ihre Verwendung? Mar 21, 2025 pm 06:46 PM

In dem Artikel werden beliebte Python-Bibliotheken wie Numpy, Pandas, Matplotlib, Scikit-Learn, TensorFlow, Django, Flask und Anfragen erörtert, die ihre Verwendung in wissenschaftlichen Computing, Datenanalyse, Visualisierung, maschinellem Lernen, Webentwicklung und h beschreiben

See all articles