Innerhalb eines Python-Bereichs erstellt jede Zuweisung zu einer Variablen, die nicht bereits in diesem Bereich deklariert wurde, eine neue lokale Variable, es sei denn , diese Variable wurde früher in der Funktion als Verweis auf eine Variable mit globalem Gültigkeitsbereich mit dem Schlüsselwort deklariert global
.
Schauen wir uns eine modifizierte Version Ihres Pseudocodes an, 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
Tatsächlich könnten Sie alles func_B
mit der benannten Variablen umschreiben x_local
und es würde identisch funktionieren.
Die Reihenfolge ist nur für die Reihenfolge von Bedeutung, in der Ihre Funktionen Operationen ausführen, die den Wert des globalen x ändern. In unserem Beispiel spielt also die Reihenfolge keine Rolle, da func_B
Anrufe func_A
. In diesem Beispiel spielt die Reihenfolge eine Rolle:
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 dies global
nur zum Ändern globaler Objekte erforderlich ist. Sie können weiterhin von einer Funktion aus auf sie zugreifen, ohne sie zu deklarieren global
. 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
- darin access_only
besteht, auf das globale x zuzugreifen, obwohl es nicht aufgerufen wird global
, und obwohl create_locally
es auch nicht verwendet wird global
, wird eine lokale Kopie erstellt, da ein Wert zugewiesen wird.
Die Verwirrung hier ist, warum Sie keine globalen Variablen verwenden sollten.