2017-08-07 3 views
1

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> 
+3

In Beispiel 1 haben Sie das nicht lokale 'z' mit einem gleichnamigen Parameter schattiert. – chepner

+0

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

+0

Funktionsparameter sind auch Einheimische; 'z' in' def inner (z): 'ist eine lokale, niemals eine Schließung oder eine globale. –

Antwort

6

Warum der Verschluss beispielsweise erzeugt wird, nicht mehr als 1, während für Beispiel 2 ist es Verschluß.

Da die innere Funktion nicht die z von der äußeren Funktion benötigt.

Auch wenn es kein Verschluss für Z wie ich in der Lage bin für Z den Wert von äußeren Funktion zu erhalten

Sie können nicht. Die z Sie bekommen ist das Argument, das Sie bestanden, nicht die z von der äußeren Funktion. (Deshalb ist es 2 statt 0).

Verwandte Themen