Heim >Backend-Entwicklung >Python-Tutorial >Python-bezogene Einführung in die Namensbindung
Pythons Namensbindung
In Python werden Objekte über Namen verknüpft und referenziert. Python führt Namen durch Namensbindungsoperationen ein.
Der sogenannte Codeblock in Python ist ein Programm, das als Ausführungseinheit dient. Zum Beispiel: Module, Funktionen, Klassendefinitionen. Befehle, die in einer interaktiven Umgebung eingegeben werden, sind ebenfalls eine Art Codeblock. Eine Python-Skriptdatei ist ebenfalls ein Codeblock. Wenn wir außerdem die Option -c in der Befehlszeile verwenden, ist der angegebene Befehl ebenfalls ein Codeblock. Die an die integrierten Funktionen eval() und exec() übergebenen String-Parameter sind ebenfalls eine Art Codeblock.
Codeblöcke werden in Form von Ausführungsrahmen ausgeführt. Ein Ausführungsrahmen enthält einige Verwaltungsinformationen und kann zum Debuggen verwendet werden. Der Ausführungsrahmen gibt außerdem an, wo und wie der nächste Code ausgeführt wird, nachdem der aktuelle Codeblock ausgeführt wurde.
Scope in Python definiert die Sichtbarkeit eines Namens innerhalb eines Codeblocks. Wenn eine lokale Variable in einem Codeblock definiert ist, ist der Gültigkeitsbereich der lokalen Variablen der Codeblock, in dem sie sich befindet. Wenn diese Definition innerhalb eines Funktionskörpers auftritt, erstreckt sich der Gültigkeitsbereich dieser Variablen auf jeden in dieser Funktion enthaltenen Codeblock. Wenn jedoch innerhalb eines in dieser Funktion enthaltenen Codeblocks derselbe Name an ein anderes Objekt gebunden ist, gelten dies auch für externe Namen nicht in diesen Codeblock erweitert werden.
def out_func(): #a的作用域在out_func这个函数中 a = 0 b = 0 def in_func(): #a的作用域从out_func扩展到了in_func中,因为in_func这个代码块包含在out_func中 print(a) #out_func函数中的b不能扩展到in_func中,因为在in_func中,b重新绑定到了不同的对象上,所以在out_func中的b的作用域不能扩展到in_func中。 b = 1
In Python können in Klassencodeblöcken definierte Namen nur in der Klasse sichtbar sein und der Bereich der Namen in der Klasse kann nicht auf Methoden in der Klasse erweitert werden. Wenn Generatorausdrücke und Listenerweiterungen in einer Klassendefinition vorkommen, können Namen in der Klasse nicht in diese Ausdrücke erweitert werden, da Listenerweiterungen und Generatorausdrücke mithilfe des Funktionsbereichs implementiert werden.
class C: a = 0 # 在列表表达式中,a会因为未定义而抛出NameError异常 b = list(a + i for i in range(10)) def method(self): #由于定义在类中的名字不能扩展到方法中,所以下面的语句是错误的,会抛出a未定义的NameError异常 print(a)
Wenn ein Name in einem Codeblock verwendet wird, wird der nächstgelegene umschließende Bereich analysiert, um den Namen zu finden. Die Menge aller dieser im aktuellen Codeblock sichtbaren Bereiche wird als
-Umgebung des aktuellen Codeblocks bezeichnet.
Die Beziehung zwischen Namensbindung und Geltungsbereich
Wenn ein Name an einen Codeblock gebunden ist, es sei denn, der Name ist als nicht lokal deklariert (die Funktion der nicht lokalen Deklaration besteht darin, die Variable im Der äußere Bereich wird vor dem globalen Bereich aufgelöst. Andernfalls ist der Name lokal für diesen Codeblock. Wenn ein Name an die Modulebene gebunden ist, ist der Geltungsbereich des Namens global und die Variable ist eine globale Variable (Variablen im Modul sind lokale Variablen für das Modul und für Codeblöcke im Modul handelt es sich dann um eine globale Variable). . Wenn ein Name in einem Codeblock verwendet wird, aber nicht innerhalb des Codeblocks definiert ist, ist die Variable eine freie Variable.
Ausnahmen im Zusammenhang mit der Namensbindung
Wenn der Name bei der Namenssuche nicht gefunden wird, wird eine NameError-Ausnahme ausgelöst, wenn der Name auf eine lokale Variable verweist, diese jedoch nicht gefunden wurde Wenn Sie an diese lokale Variable gebunden sind, wird eine UnboundLocalError-Ausnahme ausgelöst (UnboundLocalError ist eine Unterklasse von NameError).
Situationen, in denen Namensbindungsverhalten auftritt
Die Hauptverhaltensweisen, in denen Namensbindungsverhalten auftritt, sind:
Normalerweise ist der Parametername bei der Übergabe von Parametern an eine Funktion derselbe wie der übergebene. Objektbindung
Bei Verwendung der Importanweisung zum Importieren bindet die from...import *-Anweisung alle Namen im importierten Modul, die importiert werden können
Wenn die Klasse ist definiert
Wenn die Funktion definiert ist
Wenn die Zuweisungsoperation ausgeführt wird
In der for-Anweisung der for-Schleife
Wie in with Anweisung Hinter
danach wie in der Expect-Anweisung
Falle der Namensbindung in Python
In Python führen einige Regeln der Namensbindung bei der Verwendung von Namen manchmal zu unverständlichen Fehlern erscheinen, insbesondere für Benutzer mit Erfahrung in C, C++ und Java.
Unabhängig davon, wo im aktuellen Block der Namensbindungsvorgang in Python stattfindet, verwendet der Verweis auf den Namen in diesem Codeblock das im aktuellen Block gebundene Objekt. Dann tritt das Problem auf: Wenn wir auf den Namen verweisen, bevor die Namensbindungsoperation ausgeführt wird, tritt ein Fehler auf und es wird eine UnboundLocalError-Ausnahme ausgelöst.
>>> a = 10 >>> def function(): print(a) a = 20# a的绑定操作发生在print之前 >>> function() Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> function() File "<pyshell#4>", line 2, in function print(a) UnboundLocalError: local variable 'a' referenced before assignment
In Python können lokale Variablen in einem Codeblock den Bindungsnamen erhalten, indem sie den gesamten Codeblock scannen. Im obigen Code wird also der Name a an den Code übergeben, wenn der Blockscan ausgeführt wird wurde gefunden, aber der Bindungsvorgang für den Namen a ist noch nicht erfolgt, daher ist ein Fehler aufgetreten.
Wenn wir im obigen Code eine außerhalb definierte globale Variable benötigen, können wir sie mit der globalen Anweisung deklarieren. Die Funktion der globalen Anweisung
>>> a = 10 >>> def function(): global a print(a) a = 20#这里并不引入新的名字,而是将全局变量a绑定到20上 >>> function() 10 >>> a 20
besteht darin, dass nachfolgende Verweise auf das durch diese Anweisung deklarierte Objekt den Namen im Namespace der obersten Ebene verwenden. Der Namespace der obersten Ebene umfasst den globalen Namespace und den integrierten Namespace. Wenn er nicht gefunden wird, wird der integrierte Namespace durchsucht. Die globale Anweisung muss vor der Verwendung des Namens stehen.
Wenn eine freie Variable im umschließenden Bereich eine globale Deklaration enthält, gilt die freie Variable als global.
Eingebauter Namespace
Bei der Suche nach dem integrierten Namespace wird auf den Namen __builtins__ im globalen Namespace des aktuellen Codeblocks zugegriffen. Dieser Name verweist auf ein Namenswörterbuch oder ein Modul. Im Modul __main__ bezieht sich __builtins__ auf die integrierten Modul-Builtins. Wenn es sich jedoch in anderen Modulen befindet, bezieht sich __builtins__ auf das Namenswörterbuch des Builtins-Moduls.
Hinweis:
In der Implementierung von CPython können Sie die Variable __builtins__ nicht manuell ändern. Wenn Sie den Namen in diesem integrierten Namensraum überschreiben müssen, müssen Sie das integrierte Modul importieren und ändern Sie dann die entsprechenden Eigenschaften.
Das obige ist der detaillierte Inhalt vonPython-bezogene Einführung in die Namensbindung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!