Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist ein Python-Verschluss? Eine kurze Einführung in Python-Verschlüsse (mit Beispielen)

Was ist ein Python-Verschluss? Eine kurze Einführung in Python-Verschlüsse (mit Beispielen)

不言
不言nach vorne
2018-10-09 16:51:412797Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, was Python-Schließung ist. Eine kurze Einführung in Python-Verschlüsse (mit Beispielen) hat einen gewissen Referenzwert. Ich hoffe, dass sie für Sie hilfreich ist.

Was ist eine Schließung?

Tatsächlich werden wir bei der Verwendung von Funktionen versehentlich Schließungen auslösen, da aus irgendeinem Grund immer auf Variablen der oberen Funktionsschicht innerhalb der Funktion verwiesen oder diese geändert werden und dies dann zu Schließungen führt

Was ist also eine Schließung? Tatsächlich handelt es sich um eine Regel, die ausgelöst wird, wenn Funktionen verschachtelt sind. Diese Regel wird ausgelöst, wenn die aktuelle Funktion auf eine Variable im lokalen Namespace der vorherigen Funktion verweist und die Funktion selbst als Objekt zurückgegeben wird.
Wir sagen, dass die Funktion, die den Abschluss auslöst, Abschlussfunktion genannt wird

Das größte Merkmal des Abschlusses besteht darin, dass er von der äußeren Funktion zurückgegeben und dann einer Variablen zugewiesen werden kann und die Variablen trägt in der äußeren Funktion definiert

Das Beispiel lautet wie folgt:

def func1():
    a = 2  #变量a为函数func1()开辟的局部命名空间内定义的变量
    def func2(x):
        return x**a  #函数fun2()内引用了变量a
    print('func2的id:',id(func2))
    return func2 #内层函数名被当作返回值,此时闭包规则达成。
res = func1() # 此时res等同于func2,我们可以看看他们的id完全相同
print('res的id:  ',id(res))
print(res(3))
del func1
print('删除函数func1之后:',res(5))
print(res.__closure__) 
print(type(res.__closure__[0])) 
print(res.__closure__[0].cell_contents) 
#此时,如果函数func2()没有引用外部函数变量a,我们可以试着把return x**a这句改成return x,这时函数func2就没有触发闭包规则
#此时如果再次打印res.__closure__,你会发现输出值为None

Wie aus den Ausgabeergebnissen unten ersichtlich ist, verschwindet die Variable a theoretisch auch dann, wenn die Funktion func1 gelöscht wird kann weiterhin verwendet werden (theoretisch verschwindet der lokale Raum, der a entspricht, dann sollte a weiterhin referenziert werden, weil die Schließungsregel auf die lokalen Variablen der externen Funktion verweisen kann , auch wenn die externe Funktion zurückgegeben wurde.
Tatsächlich ist die Funktion selbst auch ein Objekt, und Objekte haben viele Attribute. Darunter ist das Attribut Abschluss, das sich auf den Abschluss bezieht. Das Attribut
closure definiert ein Tupel, das Zellobjekte enthält, wobei jedes Zellobjekt im Tupel zum Speichern des Werts der Variablen im Gültigkeitsbereich verwendet wird.

func2的id: 139940709362136
res的id:   139940709362136
9
删除函数func1之后: 25
#我们来打印一下res的__closure__属性,可以看出它是由cell对象组成的元组
(<cell at 0x7f467c4a8558: int object at 0x5654c2553a40>,)
<class &#39;cell&#39;> #打印类型结果就是元组
2  #打印cell中的值可以看出,这个cell对象中存储的变量值为2

Nach dem Auslösen des Abschlusses ist es möglich, auf die obere lokale Namespace-Variable zu verweisen, ohne auf den lokalen Raum angewiesen zu sein. Auch wenn die Funktion, in der sich die Variable befindet, gelöscht wird, kann sie weiterhin verwendet werden Tatsache Die Abschlussfunktion speichert es im Attribut __closure__.

Das obige ist der detaillierte Inhalt vonWas ist ein Python-Verschluss? Eine kurze Einführung in Python-Verschlüsse (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen