In vielen Ressourcen habe ich festgestellt, dass "Gültigkeitsbereich" und "Namespaces" synonym verwendet werden, was etwas verwirrend erscheint, da sie unterschiedliche Bedeutungen haben.
- Der Bereich definiert den Bereich des Codes, in dem ein Name verfügbar ist.
- Die LEGB-Regel definiert, wie Namen nachgeschlagen werden.
- Der Namespace ist ein Ort, an dem Sie nach Namen suchen.
Dann las ich:
- "Namen werden an einen Namespace gebunden, je nachdem, wo sie zugewiesen wurden ..." (was meiner Meinung nach der Umgang mit Bereichen im lexikalischen Bereich ist).
- "Funktionen fügen Ihren Programmen eine zusätzliche Namespace-Ebene hinzu" [ Ref. ] (Fügen sie keinen zusätzlichen lokalen Bereich hinzu?)
- "Alle in einer Funktionsdefinition zugewiesenen Namen werden in den lokalen Bereich (den mit dem Funktionsaufruf verknüpften Namespace) gestellt."
- "Globaler Bereich, dh ein Namespace, in dem Variablen, die auf der obersten Ebene der Moduldatei erstellt (zugewiesen) wurden, live sind."
* Alle Zitate stammen aus dem Erlernen von Python 5th Edition, Kapitel 17
Sind Namespaces in Python so, wie Bereiche implementiert werden? Sind sie dasselbe? Kann mich jemand aufklären?
Antworten:
Ein Namespace ist ein Wörterbuch, das Namen (als Zeichenfolgen) Werten zuordnet. Wenn Sie eine Aufgabe
a = 1
ausführen, mutieren Sie beispielsweise einen Namespace. Wenn Sie eine Referenz erstellenprint(a)
, durchsucht Python eine Liste von Namespaces, um einen mit dem Namen als Schlüssel zu finden.Ein Bereich definiert, in welchen Namespaces in welcher Reihenfolge gesucht wird. Der Gültigkeitsbereich einer Referenz beginnt immer im lokalen Namespace und bewegt sich nach außen, bis er den globalen Namespace des Moduls erreicht, bevor er zum
builtins
(dem Namespace, der auf Pythons vordefinierte Funktionen und Konstanten wierange
und verweist) übergehtgetattr
, der das Ende der Zeile darstellt .Stellen Sie sich vor, Sie haben eine Funktion mit dem Namen
inner
, die in einer globalen Funktion mit dem Namen verschachteltouter
ist undinner
einen Verweis auf einen Namen enthält. Python sucht zuerst iminner
Namespace. Wenn der Name nicht vorhanden ist, sucht Python imouter
Namespace. Wenn dies fehlschlägt, versucht Python denglobal
Namespace des Moduls und dann denbuiltin
Namespace und löst schließlich ein aus,NameError
wenn der Name nicht gefunden wird.Wenn wir sagen, dass
x
es sich im Namespace einer Funktion befindet, meinen wir, dass es dort lokal innerhalb der Funktion definiert ist. Wenn wir sagen, dassx
es sich im Funktionsbereich befindet, bedeutet dies, dassx
es sich entweder im Namespace der Funktion oder in einem der äußeren Namespaces befindet, in denen der Namespace der Funktion verschachtelt ist.Wann immer Sie eine Funktion definieren, erstellen Sie einen neuen Namespace und einen neuen Bereich. Der Namespace ist der neue lokale Hash von Namen. Der Bereich ist die implizite Kette von Namespaces, die am neuen Namespace beginnt und sich dann durch alle äußeren Namespaces (äußere Bereiche) bis zum globalen Namespace (dem globalen Bereich) und weiter zu den integrierten Funktionen bewegt.
Die Begriffe können fast synonym verwendet werden, aber das liegt nicht daran, dass sie dasselbe bedeuten. Das liegt daran, dass sie sich in dem, was sie implizieren, stark überschneiden.
quelle
Es gibt einen ausgezeichneten Artikel über Python - Namespaces hier . So zitieren Sie den relevanten Teil, um Ihre Frage zum Verweis zwischen Bereichen und Namespaces zu beantworten:
Stellen Sie sich zum Beispiel ein einfaches Würfelprogramm vor:
roll
hat einen eigenen Namespace , aber die Namen im Namespace des Moduls sind auch im Gültigkeitsbereich .quelle