Sei que devo evitar o uso de variáveis globais em primeiro lugar devido a uma confusão como essa, mas se eu as usar, a seguinte é uma maneira válida de usá-las? (Estou tentando chamar a cópia global de uma variável criada em uma função separada.)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
O x
que a segunda função usa tem o mesmo valor da cópia global x
que func_a
usa e modifica? Ao chamar as funções após a definição, a ordem importa?
python
global-variables
Akshat Shekhar
fonte
fonte
Respostas:
Se você deseja simplesmente acessar uma variável global, basta usar seu nome. No entanto, para alterar seu valor, você precisa usar a
global
palavra - chave.Por exemplo
Isso mudaria o valor da variável global para 55. Caso contrário, apenas atribuiria 55 a uma variável local.
A ordem das listagens de definição de função não importa (supondo que elas não se refiram de alguma forma), a ordem em que são chamadas faz.
fonte
x
emfunc_B
é uma variável local que recebe o seu valor a partir do valor de retorno da chamada parafunc_A
- então eu acho que tornaria o seu (2)func_A
alterar a variável global durante cada execução e retornarfunc_B
para uso,func_B
funcionará com um valor alterado a cada vez. Não tenho certeza do seu "como consertar". Convém aceitar a resposta mais útil para sua pergunta atual / original e considere abrir uma pergunta diferente sobre o que parece ser uma pergunta de acompanhamento.x.append("...")
, é a variável global x que é alterada, porque a local refere-se à global.Dentro de um escopo Python, qualquer atribuição a uma variável ainda não declarada nesse escopo cria uma nova variável local, a menos que essa variável seja declarada anteriormente na função como se referindo a uma variável de escopo global com a palavra-chave
global
.Vejamos uma versão modificada do seu pseudocódigo para ver o que acontece:
De fato, você pode reescrever tudo
func_B
com a variável nomeadax_local
e ela funcionaria de forma idêntica.A ordem importa apenas na ordem em que suas funções executam operações que alteram o valor do x global. Assim, em nosso exemplo, a ordem não importa, desde as
func_B
chamadasfunc_A
. Neste exemplo, a ordem importa:Observe que
global
é necessário apenas para modificar objetos globais. Você ainda pode acessá-los de dentro de uma função sem declararglobal
. Assim, temos:Observe a diferença entre
create_locally
eaccess_only
-access_only
está acessando o x global, apesar de não chamarglobal
, e mesmo quecreate_locally
não useglobal
, ele cria uma cópia local, pois está atribuindo um valor.A confusão aqui é por que você não deve usar variáveis globais.
fonte
Como outros observaram, você precisa declarar uma variável
global
em uma função quando desejar que essa função possa modificar a variável global. Se você deseja apenas acessá-lo, não precisaglobal
.Para entrar um pouco mais detalhadamente, o que significa "modificar" é o seguinte: se você deseja vincular novamente o nome global para que ele aponte para um objeto diferente, o nome deve ser declarado
global
na função.Muitas operações que modificam (modificam) um objeto não religam o nome global para apontar para um objeto diferente e, portanto, todas são válidas sem declarar o nome
global
na função.fonte
Aqui está um caso que me chamou a atenção, usando um global como valor padrão de um parâmetro.
Eu esperava que o parâmetro tivesse um valor de 42. Surpresa. O Python 2.7 avaliou o valor de globVar quando analisou pela primeira vez a função func. Alterar o valor de globVar não afetou o valor padrão atribuído ao parâmetro. Atrasar a avaliação, como a seguir, funcionou como eu precisava.
Ou, se você quer estar seguro,
fonte
is
para verificar se há algoNone
, em vez da comparação normal==
.Você pode acessar diretamente uma variável global dentro de uma função. Se você deseja alterar o valor dessa variável global, use "global variable_name". Veja o seguinte exemplo:
De um modo geral, essa não é uma boa prática de programação. Ao quebrar a lógica do espaço para nome, o código pode se tornar difícil de entender e depurar.
fonte
Você deve usar a
global
declaração quando desejar alterar o valor atribuído a uma variável global.Você não precisa ler de uma variável global. Observe que a chamada de um método para um objeto (mesmo que ele altere os dados nesse objeto) não altera o valor da variável que contém esse objeto (ausência de mágica reflexiva).
fonte
xs.append(xs.pop(0))
funciona muito bem semglobal xs
.