2009-05-31 8 views
4

Excuses, question confuse Python newbie. Disons que j'ai un module appelé animals.py .......Globales de module Python contre __init__ globales

globvar = 1 

class dog: 
    def bark(self): 
     print globvar 

class cat: 
    def miaow(self): 
     print globvar 

Quelle est la différence entre cela et

class dog: 
    def __init__(self): 
     global globvar 

    def bark(self): 
     print globvar 

class cat: 
    def miaow(self): 
     print globvar 

En supposant que je toujours instancier un premier chien? Je suppose que ma question est la suivante: Y a-t-il une différence entre les deux? Dans le deuxième exemple, l'initialisation du dog crée-t-elle un niveau de module globvar comme dans le premier exemple, qui se comportera de la même manière et aura la même portée?

Répondre

8

global ne crée pas de nouvelle variable, elle indique simplement que ce nom doit faire référence à une variable globale au lieu d'une variable locale. Habituellement, les affectations aux variables d'une fonction/classe/... renvoient à des variables locales. Par exemple prendre une fonction comme ceci:

def increment(n) 
    # this creates a new local m 
    m = n+1 
    return m 

Voici une nouvelle variable locale m est créée, même s'il pourrait y avoir une variable globale m déjà existante. C'est ce que vous voulez habituellement car un appel de fonction ne devrait pas modifier de manière inattendue les variables dans les étendues environnantes. Si vous voulez en effet de modifier une variable globale et ne pas créer un nouveau local, vous pouvez utiliser le mot-clé global:

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

Dans votre cas global dans le constructeur ne crée pas de variables, de nouvelles tentatives d'accès globvar échec:

>>> 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 

Mais si vous réellement attribuer une valeur à globvar dans le constructeur, serait créé une variable de module global lorsque vous créez un chien:

class dog: 
    def __init__(self): 
     global globvar 
     globvar = 1 
... 

Exécution:

>>> import animals 
>>> d = animals.dog() 
>>> d.bark() 
1 
>>> print animals.globvar 
1 
+0

Truc de classe, sth. Je vous remercie. Répond parfaitement à la question –

4

Non, la déclaration global compte que lorsque vous êtes attribuer à une variable globale dans une méthode ou une fonction. Alors que __init__ est sans importance - il ne pas créer le global, car il ne lui attribue rien.

+0

Sauf que la classe de chat renverra une erreur, droit Alex, si un chien n'a pas été instancié en premier? Si je n'ai pas l'instruction global globvar dans le __init__ du chien, alors chat renvoie une erreur. Mais sinon, la portée des deux est identique. Merci pour l'aide. –

+0

Dans votre deuxième exemple, vous obtiendrez toujours une erreur car vous n'avez jamais créé globvar. Le mot clé "global" ne crée pas de variable globale. L'instruction globale indique à Python que vous faites référence à une variable globale et non à une nouvelle variable locale distincte portant le même nom. Comme l'a dit Alex, cela n'a d'importance que lorsque vous attribuez une valeur à une variable globale depuis une méthode ou une fonction. – hbw

+0

@Thomas, @htw est exactement correct: pour le faire fonctionner comme vous le croyez, __init__ nécessite une affectation à globvar (et _then_ échouera si vous instanciez un chat avant un chien). –

Questions connexes