Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?

Dies ist ein bisschen ein Follow-up zu dieser Frage .

  1. Warum ist der Ort bei der Kompilierzeit und nicht zur Ausführungszeit bestimmt? Ist es rein für die Leistung?
  2. Gibt es Sprachen, die ihre Variablen zur Ausführungszeit nachschlagen? Dh jedes Mal, wenn eine Variable zugegriffen wird, wird diese Variable zuerst im lokalen Bereich gesucht und dann die Suche eskaliert durch alle umschließenden Bereiche?
  3. Wie gehen ECMA-Sprachen damit um?

Um Frage 2 mit anderen Worten: Gibt es Sprachen, wo der folgende Code (in der notwendigen Syntax) funktioniert:

def f(): print ('f') def g(): f() f = 42 g() 

One Solution collect form web for “Warum ist der Ort zum Zeitpunkt der Kompilierung bestimmt?”

Dieses Verhalten heißt lexikalisches Scoping. Was du in # 2 beschreibst, heißt dynamisches Scoping, obwohl die verbale Beschreibung irreführend ist (du sagst "umschließende Bereiche", wo "Ruffunktionen" oder "Aktivierungsaufzeichnungen" genauer sein würden).

Praktisch jede Sprache in der gemeinsamen Verwendung verwendet lexikalischen Scoping, nicht nur Python. Dazu gehören C # und ECMAScript / JavaScript (mit eval und with ), was ich vermute, was du mit "ECMA-Sprachen" meinst. Es gab Sprachen, und einige von ihnen sind noch in Gebrauch. Emacs Lisp ist eins, und Perl bietet sowohl lexikalische als auch dynamische Scoping.

Die Begründung für lexikalische Scoping ist nicht nur für die Leistung (Vollständige lexikalische Scoping einschließlich Schließungen hat tatsächlich eine Leistung Kosten , siehe die funcarg Probleme), ist es für die Einfachheit und Zuverlässigkeit. Während es vielleicht überraschend sein kann, wenn man zuerst die Sprache lernt, sind die Regeln eigentlich tot einfach, so dass ein erfahrener Programmierer sofort sagen kann, welche Verwendung eines Bezeichners auf welchen Umfang verweist. Man kann Funktionen isoliert verstehen, da die Ausführung nicht davon betroffen ist, wer diese Funktionen nennt und wie sie sich entschieden haben, ihre Variablen zu nennen.

  • Generierung von Funktionen innerhalb der Schleife mit Lambda-Ausdruck in Python
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • Funktion Ortsname Bindung aus einem äußeren Bereich
  • Wie man globale Variablen unter verschiedenen Modulen in Python hat
  • Was bedeutet Umfang
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Python Variable Scope (Vorbehalt durch Verweis oder Kopie?)
  • Blockieren Sie den Bereich in Python
  • Scoping in Python 'für' Schleifen
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Python ist die beste Programmiersprache der Welt.