Innerhalb eines Python Umfang, jede Zuordnung zu einer Variable nicht bereits in diesem Rahmen erklärt erstellt eine neue lokale Variable es sei denn diese Variable auf eine global scoped Variable zuvor in der Funktion deklariert wird, mit dem Schlüsselwort als Verweisung global
.
Blick Lassen Sie sich auf einer modifizierten Version des Pseudo-Code, um zu sehen, was passiert:
# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'
def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return x
def func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
In der Tat, Sie könnten all func_B
mit den Variablen umschreiben namens x_local
und es wäre identisch funktionieren.
Die Reihenfolge betrifft nur die Reihenfolge, in der Ihre Funktionen Vorgänge ausführen, die den Wert des globalen x ändern. So spielt in unserem Beispiel die Reihenfolge keine Rolle, da func_B
func_A
aufruft. In diesem Beispiel tut, um Materie:
def a():
global foo
foo = 'A'
def b():
global foo
foo = 'B'
b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.
Beachten Sie, dass global
nur globale Objekte zu ändern, erforderlich. Sie können weiterhin innerhalb einer Funktion darauf zugreifen, ohne global
zu deklarieren. So haben wir:
x = 5
def access_only():
return x
# This returns whatever the global value of 'x' is
def modify():
global x
x = 'modified'
return x
# This function makes the global 'x' equal to 'modified', and then returns that value
def create_locally():
x = 'local!'
return x
# This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
Beachten Sie den Unterschied zwischen create_locally
und access_only
-access_only
ist die globale x trotz nicht Aufruf global
zugreifen, und obwohl create_locally
nicht global
entweder verwenden ist, erstellt es eine lokale Kopie seit Es ist Zuweisung einen Wert.
Die Verwirrung hier ist, warum Sie keine globalen Variablen verwenden sollten.
Seien Sie vorsichtig, auch nicht anzunehmen, nur weil Sie in Ihrer Funktion eine Variable zugewiesen haben, die Python Referenzen vor der Zuweisung als solche behandeln wird. Bis zur ersten Zuweisung, wenn Sie x verwendet haben, wäre es nicht der globale oder der lokale. Sie werden die berüchtigte UnboundLocalError-Ausnahme in Ihrem Gesicht bekommen :) – osirisgothra