Python módulo globais contra init globais
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?
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