Python modulo globali contro __init__ globali
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?
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