Pergunta

Apologies, um pouco confuso Python questão novato. Digamos que eu tenho um módulo chamado animals.py .......

globvar = 1

class dog: 
   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

Qual é a diferença entre este e

class dog:
   def __init__(self):
      global globvar

   def bark(self):
      print globvar

class cat:
   def miaow(self):
      print globvar

Supondo que eu sempre instanciar um cão pela primeira vez?

Eu acho que a minha pergunta é, existe alguma diferença? No segundo exemplo, se iniciar a dog criar um nível globvar módulo assim como no primeiro exemplo, que se comportam da mesma e ter o mesmo alcance?

Foi útil?

Solução

global não cria uma nova variável, ele apenas afirma que este nome deve se referir a uma variável global em vez de um local. Normalmente atribuições para variáveis ??em uma função / classe / ... referem-se a variáveis ??locais. Por exemplo tomar uma função como esta:

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

Aqui um novo m variável local é criada, mesmo que pode haver um m variável global já existente. Isto é o que você geralmente deseja uma vez que alguns chamada de função não deve inesperadamente modificar variáveis ??nos âmbitos circundantes. Se você de fato deseja modificar uma variável global e não criar um novo local, você pode usar a palavra-chave global:

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

Em seu global caso no construtor não cria quaisquer variáveis, outras tentativas de acesso globvar falhar:

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

Mas se você realmente atribuir um valor a globvar no construtor, uma variável módulo global seria criado quando você cria um cão:

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

Execução:

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

Outras dicas

Não, a declaração global só importa quando você está atribuição para uma variável global dentro de um método ou função. Assim que __init__ é irrelevante -. Ele faz não criar o global, porque não é atribuir qualquer coisa a ele

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top