Domanda

Ci scusiamo, un po 'confusa domanda newbie Python. Diciamo che ho un modulo chiamato animals.py .......

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

Qual è la differenza tra questo e

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

Supponendo che ho sempre un'istanza di un cane prima?

Credo che la mia domanda è, c'è qualche differenza? Nel secondo esempio, non avviando il dog creare un livello globvar modulo, proprio come nel primo esempio, che si comporterà lo stesso e hanno la stessa portata?

È stato utile?

Soluzione

global non crea una nuova variabile, si afferma solo che questo nome dovrebbe fare riferimento a una variabile globale invece di un locale. Di solito assegnazioni alle variabili in una funzione / classe / ... fare riferimento a variabili locali. Per esempio prendere una funzione come questa:

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

Qui viene creato un nuovo m variabile locale, anche se ci potrebbe essere un m variabile globale già esistente. Questo è ciò che di solito si vuole dal momento che alcuni chiamata di funzione non deve inaspettatamente modificare le variabili in ambiti circostanti. Se davvero vuole modificare una variabile globale e non crearne uno nuovo locale, è possibile utilizzare la parola chiave global:

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

Nel tuo caso global nel costruttore non crea alcuna variabile, ulteriori tentativi di accesso globvar fallire:

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

Ma se si sarebbe effettivamente assegnare un valore alla globvar nel costruttore, verrebbe creata una variabile di modulo globale quando si crea un cane:

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

Esecuzione:

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

Altri suggerimenti

No, la dichiarazione global conta solo quando sei assegnazione per una variabile globale all'interno di un metodo o di una funzione. In modo che __init__ è irrilevante -. Lo fa non creare il globale, perché non è l'assegnazione nulla ad esso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top