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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top