Python Namespace und Scope
Table of Contents
In diesem Tutorial erfahren Sie mehr über Namespace, die Zuordnung von Namen zu Objekten und den Gültigkeitsbereich einer Variablen.
Was ist Name in Python?
Wenn Sie jemals ‘The Zen of Python’ gelesen haben (Typ import this
im Python-Interpreter), die letzte Zeile besagt,Namespaces sind eine tolle Idee – lasst uns mehr davon machen! Was sind also diese mysteriösen Namensräume? Schauen wir uns zuerst an, was ein Name ist.
Name (auch Bezeichner genannt) ist einfach ein Name, der Objekten gegeben wird. Alles in Python ist ein Objekt. Name ist eine Möglichkeit, auf das zugrunde liegende Objekt zuzugreifen.
Zum Beispiel, wenn wir die Zuordnung a = 2
, 2
ist ein im Gedächtnis gespeichertes Objekt und a ist der Name, mit dem wir es verbinden. Wir können die Adresse (im RAM) eines Objekts über die built-in Funktion id()
. Schauen wir uns an, wie man es benutzt.
# Hinweis: Möglicherweise erhalten Sie unterschiedliche Werte für die id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
Output
id(2) = 11065920 id(a) = 11065920
Hier beziehen sich beide auf dasselbe Objekt 2
, also haben sie das gleiche id()
. Machen wir die Dinge etwas interessanter.
# Hinweis: Möglicherweise erhalten Sie unterschiedliche Werte für die id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))
Output
id(a) = 11065920 id(a) = 11065952 id(3) = 11065952 id(b) = 11065920 id(2) = 11065920
Was passiert in der obigen Abfolge von Schritten? Lassen Sie uns dies anhand eines Diagramms erklären:
Zunächst ein Objekt 2
erstellt und der Name a ist damit verbunden, wenn wir es tun a = a+1
, ein neues Objekt 3
ist erstellt und jetzt a ist mit diesem Objekt verbunden.
Beachten Sie, dass id(a)
und id(3)
haben die gleichen Werte.
Außerdem, wenn b = 2
ausgeführt wird, der neue Name bwird mit dem vorherigen Objekt verknüpft 2
.
Dies ist effizient, da Python kein neues doppeltes Objekt erstellen muss. Diese dynamische Natur der Namensbindung macht Python mächtig; ein Name kann sich auf jede Art von Objekt beziehen.
>>> a = 5 >>> a = 'Hello World!' >>> a = [1,2,3]
All dies ist gültig und a bezieht sich in verschiedenen Fällen auf drei verschiedene Arten von Objekten. Funktionen sind auch Objekte, daher kann sich auch ein Name auf sie beziehen.
def printHello(): print("Hallo") a = printHello a()
Output
Hallo
Der selbe Namea kann auf eine Funktion verweisen und wir können die Funktion mit diesem Namen aufrufen.
Was ist ein Namespace in Python?
Nachdem wir nun verstanden haben, was Namen sind, können wir zum Konzept der Namensräume übergehen.
Einfach ausgedrückt ist ein Namespace eine Sammlung von Namen.
In Python können Sie sich einen Namensraum als Zuordnung jedes von Ihnen definierten Namens zu entsprechenden Objekten vorstellen.
Verschiedene Namespaces können zu einem bestimmten Zeitpunkt nebeneinander existieren, sind jedoch vollständig isoliert.
Ein Namespace mit allen eingebauten Namen wird beim Starten des Python-Interpreters erstellt und existiert, solange der Interpreter läuft.
Dies ist der Grund, warum eingebaute Funktionen wie id()
, print()
etc. stehen uns jederzeit aus jedem Teil des Programms zur Verfügung. Jeder modul erstellt einen eigenen globalen Namensraum.
Diese verschiedenen Namensräume sind isoliert. Daher kollidiert der gleiche Name, der in verschiedenen Modulen vorkommen kann, nicht.
Module können verschiedene Funktionen und Klassen haben. Beim Aufruf einer Funktion wird ein lokaler Namensraum erstellt, in dem alle Namen definiert sind. Ähnlich verhält es sich mit der Klasse. Das folgende Diagramm kann helfen, dieses Konzept zu verdeutlichen.
Python Variable Scope
Obwohl verschiedene eindeutige Namensräume definiert sind, können wir möglicherweise nicht von jedem Teil des Programms auf alle zugreifen. Der Begriff der Reichweite kommt ins Spiel.
Ein Geltungsbereich ist der Teil eines Programms, von dem aus direkt auf einen Namensraum ohne Präfix zugegriffen werden kann.
Zu jedem Zeitpunkt gibt es mindestens drei verschachtelte Bereiche.
- Gültigkeitsbereich der aktuellen Funktion mit lokalen Namen
- Geltungsbereich des Moduls mit globalen Namen
- Äußerster Bereich mit integrierten Namen
Wenn innerhalb einer Funktion auf eine Referenz verwiesen wird, wird der Name im lokalen Namensraum, dann im globalen Namensraum und schließlich im integrierten Namensraum gesucht.
Wenn sich eine Funktion innerhalb einer anderen Funktion befindet, wird ein neuer Geltungsbereich innerhalb des lokalen Geltungsbereichs verschachtelt.
Example of Scope and Namespace in Python
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Hier ist die Variable a befindet sich im globalen Namensraum. Variable b befindet sich im lokalen Namensraum von outer_function()
und c befindet sich im verschachtelten lokalen Namensraum von inner_function()
.
Wenn wir drin sind inner_function()
, c ist bei uns lokal, b ist nicht lokal und aist global. Wir können sowohl lesen als auch neue Werte zuweisen c kann aber nur lesenb und a von inner_function()
.
Wenn wir versuchen, als Wert zuzuweisen b, eine neue Variable b wird im lokalen Namensraum erstellt, der sich vom nichtlokalen unterscheidet b. Das Gleiche passiert, wenn wir . einen Wert zuweisen a.
Wenn wir jedoch erklären, aAls global gehen alle Referenzen und Zuweisungen an das globale a. Ähnlich, wenn wir die Variable erneut binden wollen b, es muss als nichtlokal deklariert werden. Das folgende Beispiel soll dies weiter verdeutlichen.
def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Wie Sie sehen können, ist die Ausgabe dieses Programms
a = 30 a = 20 a = 10
In diesem Programm sind drei verschiedene Variablena werden in separaten Namensräumen definiert und entsprechend aufgerufen. Während Sie im folgenden Programm
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Die Ausgabe des Programms ist.
a = 30 a = 30 a = 30
Hier sind alle Referenzen und Zuordnungen zu den globalen a aufgrund der Verwendung von Schlüsselwörtern global
.