Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Namensbindung

Python-Namensbindung

高洛峰
高洛峰Original
2016-10-17 17:42:421539Durchsuche

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 kann der im Klassencodeblock definierte Name nur in der Klasse sichtbar sein, der Gültigkeitsbereich des Namens in der Klasse jedoch nicht erweiterte Methode in der Klasse sein. 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 C-, C- und Java-Erfahrung.

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 &#39;a&#39; referenced before assignment

In Python können lokale Variablen in einem Codeblock den Bindungsnamen erhalten, indem sie den gesamten Codeblock scannen, also im obigen Code den Namen a wurde durch Scannen des Codeblocks beim Ausführen von print gefunden, der Bindungsvorgang für den Namen a wurde jedoch noch nicht durchgeführt, sodass ein Fehler aufgetreten ist.

Wenn wir im obigen Code eine außerhalb definierte globale Variable benötigen, können wir sie mit der globalen Anweisung deklarieren.

>>> a = 10
>>> def function():
global a
print(a)
a = 20#这里并不引入新的名字,而是将全局变量a绑定到20上
>>> function()
10
>>> a
20

Die Funktion der globalen Anweisung besteht darin, bei nachfolgenden Verweisen auf das durch diese Anweisung deklarierte Objekt den Namen im Namensraum der obersten Ebene zu 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 erscheinen, bevor der Name verwendet wird.

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. 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.


Stellungnahme:
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