Die Variable "bar" in der folgenden Funktionsdefinition wird als globale Variable interpretiert, da der Funktionsblock keine Definition von "bar" enthält.
def foo():
print(bar)
Der folgende Code ist erfolgreich, da die globale Variable "bar" vor dem Aufruf von "foo" definiert wird.
bar = 4
def foo():
print(bar)
foo() # => 4
Sie können die globalen Variablen von "foo" im Attribut "co_names" des Codeobjekts von "foo" sehen.
foo.__code__.co_names # => ('print', 'bar')
Übrigens wird in Pythons Offizielles Dokument "co_names" als lokaler Variablenname "tuple" geschrieben, aber (lokaler Variablenname) (Ohne freie Variablen) Namensfehler.
Bar
in der folgenden Funktionsdefinition wird als lokale Variable interpretiert, da bar
im Block der Funktion definiert ist.
def foo():
print(bar)
bar = 3
foo.__code__.co_names # => ('print',)
Lokale Variablen für foo
finden Sie im Attribut co_varnames
des Codeobjekts für foo
.
foo.__code__.co_varnames # => ('bar',)
Diese Interpretation wird bestimmt, wenn die Funktionsdefinition vorgenommen wird. Selbst wenn vor der Definition von "Balken" ein "Balken" steht, wird dieser nicht als globale Variable interpretiert, und es tritt ein Fehler wie folgt auf.
bar = 4
def foo():
print(bar)
bar = 3
foo()
# => UnboundLocalError: local variable 'bar' referenced before assignment
Mit anderen Worten, der Name im Funktionsblock wird in der Phase der Funktionsdefinition als globale Variable oder lokale Variable (oder freie Variable) bestimmt und zum Zeitpunkt der Zuweisung zum Namen nicht von der globalen Variablen zur lokalen Variablen zurückgebunden.
Darüber hinaus führen inklusive Notationen wie Listen einen neuen Bereich ein, aber nur die Iterablen, die dem ersten "für" entsprechen, werden im äußeren Bereich interpretiert. Das folgende Beispiel ist erfolgreich. Aufgrund der drei "Balken" in der Listeneinschlussnotation wird der am weitesten rechts stehende "Balken" als der Bereich von "foo" interpretiert, dh der globalen Variablen "Balken".
bar = range(3)
def foo():
print([bar for bar in bar])
foo() # => [0, 1, 2]