/ / Warum kann ich in Python keine globale Variable setzen? - Python, globale Variablen

Warum kann ich in Python keine globale Variable festlegen? - Python, globale Variablen

Wie funktionieren globale Variablen in Python? Ich weiß, dass globale Variablen böse sind, ich experimentiere nur.

Dies funktioniert nicht in Python:

G = None

def foo():
if G is None:
G = 1

foo()

Ich erhalte einen Fehler:

UnboundLocalError: local variable "G" referenced before assignment

Was mache ich falsch?

Antworten:

58 für die Antwort № 1

Du brauchst das global Erklärung:

def foo():
global G
if G is None:
G = 1

In Python Variablen das Sie zuweisen werden standardmäßig zu lokalen Variablen. Sie müssen verwenden global um sie als globale Variablen zu deklarieren. Auf der anderen Seite Variablen, die Sie beziehen sich aber nicht auf werden nicht automatisch zu lokalen Variablen. Diese Variablen beziehen sich auf die nächste Variable in einem einschließenden Bereich.

Python 3.x führt die nonlocal Aussage, die analog ist global, bindet jedoch die Variable an den nächstliegenden umschließenden Bereich. Zum Beispiel:

def foo():
x = 5
def bar():
nonlocal x
x = x * 2
bar()
return x

Diese Funktion gibt bei Aufruf 10 zurück.


8 für die Antwort № 2

Sie müssen erklären G wie global, aber wie, warum: wann immer Sie sich auf eine Variable innerhalb einer Funktion beziehen, wenn Sie einstellen Als Variable an einer beliebigen Stelle in dieser Funktion nimmt Python an, dass es sich um eine lokale Variable handelt. Wenn also keine lokale Variable mit diesem Namen an dieser Stelle im Code vorhanden ist, erhalten Sie die UnboundLocalError. Wenn Sie, wie in Ihrer Frage, tatsächlich auf eine globale Variable verweisen wollten, benötigen Sie das global Schlüsselwort, um Python das zu sagen, was Sie meinten.

Wenn Sie der Variablen nicht irgendwo in der Funktion zuweisen, sondern nur auf ihren Wert zugreifen, verwendet Python die globale Variable mit diesem Namen, sofern vorhanden.

G = None

def foo():
if G is None:
print G

foo()

Dieser Code wird gedruckt None und wirft den UnboundLocalError nicht.


6 für die Antwort № 3

Sie müssen G innerhalb dieser Funktion immer noch als global deklarieren:

G = None

def foo():
global G
if G is None:
G = 1

foo()
print G

was einfach ausgibt

1

2 für die Antwort № 4

Definiere G als global in der Funktion wie folgt:

#!/usr/bin/python

G = None;
def foo():
global G
if G is None:
G = 1;
print G;

foo();

Die obigen Python-Drucke 1.

Die Verwendung globaler Variablen ist eine schlechte Praxis, weil: http://c2.com/cgi/wiki?GlobalVariablesAreBad