Python módulo de variables globales frente __init__ globales
Pregunta
Disculpas, algo confusa pregunta novato Python. Digamos que tengo un módulo llamado animals.py
.......
globvar = 1
class dog:
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
¿Cuál es la diferencia entre esto y
class dog:
def __init__(self):
global globvar
def bark(self):
print globvar
class cat:
def miaow(self):
print globvar
Si se asume que siempre crear instancias de un perro por primera vez?
Creo que mi pregunta es, ¿hay alguna diferencia? En el segundo ejemplo, no iniciar la dog
crear un globvar
nivel de módulo igual que en el primer ejemplo, que se comportan de la misma y tienen el mismo alcance?
Solución
global
no crea una nueva variable, sólo se afirma que este nombre debe hacer referencia a una variable global en lugar de uno local. Por lo general, las asignaciones a las variables en una función / clase / ... se refieren a las variables locales. Por ejemplo tener una función como esta:
def increment(n)
# this creates a new local m
m = n+1
return m
A continuación, se crea una nueva variable local m
, aunque podría haber una m
variable global ya existente. Esto es lo que normalmente se desea, ya que algunos llamada de función no debe modificar las variables de forma inesperada en los ámbitos de los alrededores. Si en verdad desea modificar una variable global y no crear uno nuevo local, se puede utilizar la palabra clave global
:
def increment(n)
global increment_calls
increment_calls += 1
return n+1
En el caso global
en el constructor no crea ninguna variable, más intentos de acceso globvar
fallar:
>>> 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
Pero si usted realmente asignar un valor a globvar
en el constructor, se crearía una variable de módulo global cuando se crea un perro:
class dog:
def __init__(self):
global globvar
globvar = 1
...
Ejecución:
>>> import animals
>>> d = animals.dog()
>>> d.bark()
1
>>> print animals.globvar
1
Otros consejos
No, la declaración global
sólo importa cuando estás asignación a una variable global dentro de un método o función. De manera que __init__
es irrelevante -. Lo hace no crear el mundial, porque no es nada asignando a ella