1.) Warum der Verschluss nicht zum Beispiel 1 erzeugt wird, während zum Beispiel 2 ist Schließung.Warum gibt es keinen Verschluss für Z
2.) Beispiel 1 Obwohl es keine Schließung für Z gibt, wie ich den Wert aus der äußeren Funktion für Z erhalten kann (Sobald der lokale Funktionsbereich überschritten ist, werden alle Objekte auf Basis des Abschlusses gesammelt oder beibehalten
)Beispiel 1
def outer():
x=3
y=4
z=0
def inner(z):
return x,y,z
return inner
i=outer()
i.__closure__
Out[69]:
(<cell at 0x000000000451D738: int object at 0x0000000001D681A8>,
<cell at 0x000000000451D408: int object at 0x0000000001D68190>)
Ausgang
i(2)
Out[78]: (3, 4, 2)
Aber wenn ich tun
Beispiel 2
def outer():
x=3
y=4
z=0
def inner():
return x,y,z
return inner
i=outer()
i.__closure__
Out[72]:
(<cell at 0x000000000451D528: int object at 0x0000000001D681A8>,
<cell at 0x000000000451D3A8: int object at 0x0000000001D68190>,
<cell at 0x000000000451D9A8: int object at 0x0000000001D681F0>
In Beispiel 1 haben Sie das nicht lokale 'z' mit einem gleichnamigen Parameter schattiert. – chepner
Rufen Sie Ihren Parameter zu 'inneren' etwas auf, das' z' nicht wie 'w' schattiert. Was soll das dritte Ausgabeargument in diesem Fall 'z' oder' w' sein? In jedem Fall wird es wie codiert funktionieren. Nicht sicher, was dich stolpert. –
Funktionsparameter sind auch Einheimische; 'z' in' def inner (z): 'ist eine lokale, niemals eine Schließung oder eine globale. –