2009-05-31 19 views
4

Entschuldigung, etwas verwirrt Python Newbie Frage. Lassen Sie uns sagen, dass ich ein Modul animals.py .......Python-Modul Globals gegen __init__ Globals

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 

Angenommen, ich immer instanziiert einen Hund zuerst genannt haben?

Ich denke, meine Frage ist, gibt es einen Unterschied? Im zweiten Beispiel, Initiieren der dog Erstellen einer Modul-Ebene globvar genau wie im ersten Beispiel, das wird sich gleich verhalten und haben den gleichen Umfang?

Antwort

8

global erstellt keine neue Variable, es besagt lediglich, dass sich dieser Name auf eine globale Variable statt auf eine lokale Variable beziehen sollte. In der Regel beziehen sich Zuordnungen zu Variablen in einer Funktion/class/... 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 sein m bereits bestehenden. Dies ist das, was Sie normalerweise möchten, da ein Funktionsaufruf Variablen in den umgebenden Bereichen nicht unerwartet ändern sollte. Wenn Sie in der Tat eine globale Variable ändern möchten, und nicht eine neue lokale erstellen, können Sie das global Schlüsselwort:

def increment(n) 
    global increment_calls 
    increment_calls += 1 
    return n+1 

In Ihrem Fall global im Konstruktor keine Variablen, weitere Versuche, den Zugriff auf globvar 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 globvar im Konstruktor, ein Modul-globale Variable würde erstellt zuweisen würde, 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 
+0

Klassenzeug, etw. Vielen Dank. Perfekt beantwortet die Frage –

4

Nein, die global-Anweisung ist nur relevant, wenn Sie einer globalen Variablen innerhalb einer Methode oder Funktion zuweisen. So dass __init__ ist irrelevant - es tut nicht erstellen Sie die globale, weil es nichts zuweist.

+0

Außer dass Katze Klasse einen Fehler zurück, rechts Alex, wenn ein Hund zuerst instanziiert wird nicht? Wenn ich die globale globvar-Anweisung nicht im __init__ des Hundes habe, gibt cat einen Fehler zurück. Aber ansonsten ist der Umfang der beiden identisch. Danke für die Hilfe. –

+0

In Ihrem zweiten Beispiel erhalten Sie immer einen Fehler, weil Sie nie globvar erstellt haben. Das Schlüsselwort "global" erstellt keine globale Variable. Die globale Anweisung teilt Python mit, dass Sie auf eine globale Variable verweisen und keine neue, separate lokale Variable mit demselben Namen erstellen. Wie Alex sagte, ist dies nur dann von Bedeutung, wenn Sie einer globalen Variablen einen Wert innerhalb einer Methode oder Funktion zuweisen. – hbw

+0

@Thomas, @htw ist genau richtig: Damit es funktioniert, wie Sie denken, sollte es __init__ erfordert eine Zuordnung zu globvar (und _then_ es wird fehlschlagen, wenn Sie eine Katze vor einem Hund instanziieren). –

Verwandte Themen