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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top