2016-07-11 35 views
0

hallo Jungs, die ich kann nicht herausfinden, warum, wenn find_average() genannt wird, total = 20 im globalen Bereich für die find_total() Funktion verwendet wird, statt total = 10 im umgebenden Gültigkeitsbereich? Vielen Dank im Voraus für alle Einsichten und Hilfe!Variable in geschlossenem lokalem Bereich vs Variable in globalen Bereich - Python

total = 20 

def find_total(l): 
    return total 

def find_length(l): 
    length = len(l) 
    return length 

def find_average(l): 
    total = 10 
    return find_total(l)/find_length(l) 


average = find_average(example_list) 
+0

Was ist der Inhalt von example_list? – Jens

+1

total = 10 erstellt eine neue Variable, die nur in 'find_avarage' sichtbar ist, nicht in Funktionen, die von ihr aufgerufen werden. – Jens

+0

soll eine Liste von Zahlen sein. –

Antwort

0

Jede Funktion hat ihren eigenen Bereich. Es beginnt bei den Funktionen local, innerer scope, dann geht es durch umschließende Funktionen nach außen, bis es globalen (Modul) Geltungsbereich erreicht. Diese Reihenfolge hängt vom Gültigkeitsbereich ab, in dem die Funktion in definiert ist. Der Stapel (aufrufende Sequenz) ist nicht für die Variablensuche verwendet.

In Ihrem Beispiel hat jede Funktion nur ihren inneren Bereich, gefolgt vom äußeren Bereich. Für find_total sind das <module>.find_total.<locals> und <module>. Also, immer wenn find_total ausgeführt wird, wird es total in seinem lokalen Bereich suchen, fehlschlagen, und im globalen Bereich suchen. Dort, total == 20.

Der Bereich innerhalb find_average ist exklusiv für find_average. Kein globaler Bereich, find_total oder find_length kann darauf zugreifen. Wenn Sie etwas von innen find_average zu find_total übergeben möchten, sollten Sie dies über einen Parameter tun.


Alternativ, wenn find_total kann innerhalb find_average definiert werden. Auf diese Weise löst find_total Namen durch Suchen der Sequenz <module>.find_average.<locals>.find_total.<locals> -> <module>.find_average.<locals> -> <module>.

total = 20 

def find_length(l): 
    length = len(l) 
    return length 

def find_average(l): 
    total = 10 
    def find_total(l): 
    return total 
    return find_total(l)/find_length(l) 

average = find_average(example_list) 

Diese find_totalunzugänglich von außen find_average werden!

+0

ah! ich habe also mißverstanden, dass die Aufrufsequenz (wie du erwähnt hast) die Bereiche der Funktionen bestimmt. Es wird vielmehr dadurch bestimmt, wo die Funktionen definiert sind, z.B. ob "find_total" in "find_average" definiert ist. Hab ich recht? –