Module Python globals par rapport __init__ GLOBALS
Question
Toutes mes excuses, un peu confus newbie question Python. Disons que j'ai un module appelé animals.py
.......
globvar = 1
class dog:
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Quelle est la différence entre ceci 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, est-il une différence? Dans le second exemple, n'initiant la dog
créer un niveau module de globvar
comme dans le premier exemple, qui se comportent de la même et avoir la même portée?
La solution
global
ne crée pas une nouvelle variable, il dit simplement que ce nom doit faire référence à une variable globale au lieu d'un local. En général, à des variables demandes dans une fonction / classe / ... se référer aux 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 m
variable locale est créée, même s'il pourrait y avoir une m
variable globale déjà existante. C'est ce que vous voulez généralement depuis un certain appel de fonction ne doit pas modifier de façon inattendue les variables dans les champs environnants. 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 global
cas 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
Autres conseils
Non, la déclaration de global
compte que lorsque vous êtes affectation à une variable globale dans une méthode ou une fonction. Pour que __init__
est hors de propos -. Finalité pas créer le monde, parce qu'il ne rien affecter à ce