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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top