Python Modul globals Vergleich __init__ globals
Frage
Apologies, etwas verwirrt Python newbie Frage. Lassen Sie uns sagen, dass ich ein Modul namens animals.py
haben .......
globvar = 1
class dog:
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Was ist der Unterschied zwischen diesem und
class dog:
def __init__(self):
global globvar
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Unter der Annahme, ich immer einen Hund instanziiert zuerst?
Ich denke, meine Frage ist, gibt es einen Unterschied? Im zweiten Beispiel wird die Einleitung des dog
eine Modulebene globvar
schaffen wie im ersten Beispiel, das die gleichen und hat den gleichen Umfang verhalten?
Lösung
global
hat eine neue Variable nicht schaffen, es heißt nur, dass dieser Name auf eine globale Variable beziehen sollte statt einem lokalen ein. Normalerweise Zuweisungen an Variablen in einer Funktion / Klasse / ... beziehen sich auf lokale Variablen. Zum Beispiel eine Funktion wie diese nehmen:
def increment(n)
# this creates a new local m
m = n+1
return m
Hier ist eine neue lokale Variable m
erstellt wird, auch wenn es möglicherweise eine globale Variable m
sein bereits bestehenden. Dies ist, was Sie in der Regel wollen, da einiger Funktionsaufruf nicht unerwartet sollte Variablen in den umliegenden Bereichen ändern. Wenn Sie in der Tat eine globale Variable ändern möchten, und nicht eine neue lokale erstellen, können Sie das global
Schlüsselwort verwenden:
def increment(n)
global increment_calls
increment_calls += 1
return n+1
In Ihrem Fall global
im Konstruktor keine Variablen, weitere Versuche globvar
zuzugreifen fehlschlagen:
>>> import animals
>>> d = animals.dog()
>>> d.bark()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "animals.py", line 7, in bark
print globvar
NameError: global name 'globvar' is not defined
Aber wenn Sie tatsächlich einen Wert zuweisen im Konstruktor globvar
, ein Modul-globalen Variable würde erstellt werden, wenn Sie einen Hund zu erstellen:
class dog:
def __init__(self):
global globvar
globvar = 1
...
Ausführung:
>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1
Andere Tipps
Nein, nur die global
Aussage zählt, wenn Sie Zuordnung in einer globalen Variablen innerhalb einer Methode oder Funktion. So dass __init__
ist irrelevant -. Es hat nicht die globalen schaffen, weil es nichts zu ihm zuweisen