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_total
unzugänglich von außen find_average
werden!
Was ist der Inhalt von example_list? – Jens
total = 10 erstellt eine neue Variable, die nur in 'find_avarage' sichtbar ist, nicht in Funktionen, die von ihr aufgerufen werden. – Jens
soll eine Liste von Zahlen sein. –