O que eu entendo ao ler a documentação é que o Python tem um espaço para nome separado para funções e, se eu quiser usar uma variável global nessa função, preciso usá-lo global
.
Estou usando o Python 2.7 e tentei este pequeno teste
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Parece que as coisas estão funcionando bem, mesmo sem global
. Consegui acessar a variável global sem nenhum problema.
Estou faltando alguma coisa? Além disso, a seguir é da documentação do Python:
Os nomes listados em uma instrução global não devem ser definidos como parâmetros formais ou em um destino de controle de loop for, definição de classe, definição de função ou instrução de importação.
Embora os parâmetros formais e a definição de classe façam sentido para mim, não consigo entender a restrição de destino de controle de loop e definição de função.
def foo(): ...
efoo = ...
ao mesmo tempo). Ele cria um novo escopo para cada chamada de função. (Mas como isso é diferente de todos os outros linguagem remotamente de alto nível no mundo?)Respostas:
A palavra
global
- chave é útil apenas para alterar ou criar variáveis globais em um contexto local, embora a criação de variáveis globais raramente seja considerada uma boa solução.O exposto acima lhe dará:
Embora se você usar a
global
instrução, a variável ficará disponível "fora" do escopo da função, tornando-se efetivamente uma variável global.Portanto, o código acima fornecerá a você:
Além disso, devido à natureza do python, você também pode usar
global
para declarar funções, classes ou outros objetos em um contexto local. Embora eu desaconselhe, pois causa pesadelos se algo der errado ou precisar de depuração.fonte
globals
definido automaticamente em todos os namespaces (felizmente). Como você apontou corretamente, um global é vinculado a um espaço para nome em um módulo, no entanto, pode ser importado para outro módulo comofrom module import variable
ouimport module.variable
. No primeiro caso, a importação tornaria a variável acessível comovariable
sem exigir referência comomodule.
. Se for considerado global no escopo do módulo, dependerá de onde é importado. Veja tambémnonlocal
como uma nova palavra-chave relacionada ao escopo no python 3.Embora você possa acessar variáveis globais sem a
global
palavra - chave, se você quiser modificá-las, precisará usar aglobal
palavra - chave. Por exemplo:No seu caso, você está apenas acessando a lista
sub
.fonte
foo = 3
sem trabalhos globais, mas foo é definido novamente localmente noblub
escopo da função e não modifica a variável foo original. Isso foi bastante confuso para mim.Essa é a diferença entre acessar o nome e vinculá- lo a um escopo.
Se você está apenas procurando uma variável para ler seu valor, tem acesso ao escopo global e local.
No entanto, se você atribuir a uma variável cujo nome não esteja no escopo local, vincule esse nome a esse escopo (e se esse nome também existir como global, você o ocultará).
Se você deseja atribuir ao nome global, é necessário dizer ao analisador para usar o nome global em vez de vincular um novo nome local - que é o que a palavra-chave 'global' faz.
A vinculação em qualquer lugar dentro de um bloco faz com que o nome em qualquer parte desse bloco seja vinculado, o que pode causar algumas conseqüências de aparência bastante estranha (por exemplo, UnboundLocalError aparecendo repentinamente no código que estava funcionando anteriormente).
fonte
As outras respostas respondem à sua pergunta. Outra coisa importante a saber sobre nomes em Python é que eles são locais ou globais em uma base por escopo.
Considere isso, por exemplo:
Você provavelmente pode adivinhar que a
value = 0
instrução será atribuída a uma variável local e não afetará o valor da mesma variável declarada fora dadoit()
função. Você pode se surpreender ao descobrir que o código acima não será executado. A declaraçãoprint value
dentro da função produz umUnboundLocalError.
O motivo é que o Python percebeu que, em outro lugar da função, você atribui o nome
value
e tambémvalue
não é declarado em nenhum lugarglobal
. Isso a torna uma variável local. Mas quando você tenta imprimi-lo, o nome do local ainda não foi definido. O Python, nesse caso , não volta a procurar o nome como uma variável global, como algumas outras linguagens. Essencialmente, você não pode acessar uma variável global se tiver definido uma variável local com o mesmo nome em qualquer lugar da função.fonte
global
(ounonlocal
no Python 3.x) substitui esse comportamento e permite que você atribua novamente o nome externo.let
são hasteadas.global
ou não importa?Acessar um nome e atribuir um nome são diferentes. No seu caso, você está apenas acessando um nome.
Se você atribuir a uma variável dentro de uma função, essa variável será assumida como local, a menos que você a declare global. Na ausência disso, supõe-se que seja global.
fonte
global
Exemplo:
fonte
Qualquer variável declarada fora de uma função é assumida como global; é somente ao declará-la de dentro de funções (exceto construtores) que você deve especificar que a variável seja global.
fonte
Isso é explicado bem nas Perguntas frequentes do Python
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
fonte
Isso significa que você não deve fazer o seguinte:
fonte
Global torna a variável "Global"
Isso faz com que 'x' atue como uma variável normal fora da função. Se você retirasse o global, isso causaria um erro, pois não pode imprimir uma variável dentro de uma função.
fonte