Ir ao conteúdo
  • Cadastre-se

Python uso de variáveis globais em funções sem passagem de parametros


Posts recomendados

estava estudando um pouco sobre funções e surgiu uma duvida,  é possível ou não usar as variáveis globais em funções sem o uso do "global". porque em alguns casos percebi que pode e em outros não. por exemplo

#imprimindo o hello world

def funcao():
	print(x)

x = 'hello world!'
funcao()
x = 'ola mundo!'
funcao()

neste caso terá como resultado uma impressão dos dois prints, ou seja usei a variável global na função sem usar parametros, mas neste caso a seguir não dá por exemplo

#calcula-se uma função polinominal especifica do tipo f(x) = ax + b

def f():
	x = 5 * x + 7
	print(x)

x = 10
f()
#um erro irá acontecer

dai comecei a ter algumas conclusões e no final eu concluir que é possível usar uma variável global dentro de uma função sem parâmetro (e sem o global) se eu não alterar o valor dessa variável. caso isso não ocorra eu posso então usar esse valor dentro da função diretamente para qualquer situação que não caia da condição anterior. mas tenho algumas duvidas.

 

a primeira é se minha conclusões está certa, se não até que ponto ela está certa?

a segunda é que porque? se uma variável é global ela não deveria ser acessível a qualquer função? porque essas limitações?

a terceira é se existe alguma linguagem em que isso seja possível? ou seja que as duas ocasiões funcionassem sem problemas, ou alguma linguagem que não funcionasse de forma nenhuma?

 

agradeço desde já qualquer retorno, qualquer informação a mais é bastante valida :)

 

outra coisa que vi na internet é que deve tomar cuidado ao usar o global ou sei la por ser perigoso mas não entendi direito, exemplo

def cachorro_louco():
	global raiva
	if raiva:
    	raiva = False
        print('se vacine mano')
	else:
		raiva = True
        print('então venha que te mordo')

raiva = False
cachorro_louco
cachorro_louco

isso não me parece complexo ou perigoso, ou sera que envolve alguns conceitos avançados na programação? essa ultima parte editei de ultima hora não sei se esta claro o suficiente 😕

Link para o comentário
Compartilhar em outros sites

Citação

estava estudando um pouco sobre funções e surgiu uma duvida,  é possível ou não usar as variáveis globais em funções sem o uso do "global". porque em alguns casos percebi que pode e em outros não. por exemplo

 

Não é bem assim!...Todas as variáveis no python são tratadas como globais!

 

Já o uso da palavra reservada global dentro do escopo de uma função não é de uso recomendado, é considerado uma má prática de programação. O código fica mais difícil de ser entendido e modificar sua implementação, pois você precisará saber todos os lugares onde a variável global está sendo usada e isso com certeza em outras partes do seu código vai gerar erros que serão difíceis de serem encontrados.

Por isso que o Python exige do programador que seja feito de forma explicita a referência global a uma variável dentro do escopo de uma função quando quiser alterá-la, o que volto a dizer que não o faça dessa forma!

 

Rode este script abaixo no seu Python e veja a diferença entre as duas variáveis que são globais, sendo uma delas declarada explicitamente como global, ambas estão corretas elas estão no escopo global do programa, porém uma delas vai apresentar erro e veja o porquê.

#Irá gerar ao rodar o script um NameError: name 'variavel' is not defined.....agora comente esta variável e rode novamente para a Global
variavel 

#Não gerar um NameError, pois a variável neste caso cria somente uma reserva na memória que vai aguardar receber um valor
global variavel2

Toda variável declarada no escopo Global deve receber um valor, a não ser nesse caso em que você deixa explicito a palavra reservada global precedendo a variável, ela então faz uma reserva de memória e fica aguardando um valor que é quando ela será inicializada efetivamente.

 

Veja agora um exemplo em que a variável global declarada dentro do escopo da função, consegue modificar a variável também global, mas declarada no escopo global, prática esta que não é recomendada!

def func():
    global x
    x = 1
    print x
 
x = 42
func()
print x

"""
O código acima imprime:

1
1
"""

Embora você veja que o X do escopo global se pareça com o X do escopo da função, eles não são os mesmo, isso porque o Python considera todas as variáveis como objetos e cada objeto tem seu ID, então o nome da variável acaba sendo meramente uma etiqueta do ID do objeto, prova disso é o código abaixo.

def func():
    global x
    x = 1
    print(x)

x = 42
print(x)
print("veja o id: "+str(id(x)))

print(10*"-")

func()
print("veja o id: "+str(id(x)))

rode este script.

Link para o comentário
Compartilhar em outros sites

@fspjonny não entendi você disse que todas as variaveis no python são tratadas como globais, isso deveria significar que uma variavel declarada em uma função, tornasse possível seu uso no resto do programa o que acaba meio que não acontecendo.

também deveria ser possivel alterar seu valor diretamente. tipo minha duvida é que porque em alguns casos funcionam e em outros não, por exemplo o primeiro do caso do print do hello world, eu usei a variavel na funcao sem usar o global e sem usar parametros, mas na segunda não foi possivel fazer isso, só não entendi porque

Link para o comentário
Compartilhar em outros sites

22 minutos atrás, Cachorro_louco disse:

@fspjonny não entendi você disse que todas as variaveis no python são tratadas como globais, isso deveria significar que uma variavel declarada em uma função, tornasse possível seu uso no resto do programa o que acaba meio que não acontecendo.

 

Sim todas, desde que estejam declaradas fora da função ou seja no escopo global do programa!

Quando uma variável está declarada dentro do escopo de uma função ela é uma variável local, mas é enxergada dentro de toda função, inclusive se você aninhar funções, o que a torna no primeiro nível uma global da função inicial, ou seja ela será enxergadas pelas outras funções abaixo dela, e ela só exite enquanto a função estiver ativa, quando a função termina a variável deixa de existir, sai da memória até ser novamente chamada.

 

Citação

também deveria ser possivel alterar seu valor diretamente. tipo minha duvida é que porque em alguns casos funcionam e em outros não, por exemplo o primeiro do caso do print do hello world, eu usei a variavel na funcao sem usar o global e sem usar parametros, mas na segunda não foi possivel fazer isso, só não entendi porque

 

Mas é possível sim, o resultado do que acontece dentro de uma função deverá ser passado para fora(return) ou seja para o escopo global, para que o resultado ou seja exibido ou então ele passe a integrar uma nova função.

Assim:

def soma():
    return 10

envia = soma() # Resultado no escopo global

def result():
    print(envia)

result()

No questionamento sobre os seu exemplos acima:

def funcao():
    print(x)

x = "hello world!" # Variável global X recebeu um valor!
funcao() # Executou a função e deixou de existir na memória

x = "Olá mundo!" # Variável global X recebeu um novo valor!
funcao() # Executou a função e deixou de existir na memória

# Isso ocorrerá sempre a cada nova iteração de X e a chamada da função

x = "Olá novamente !"
funcao()

agora já em:

"""
o X de x+7 ainda não recebeu valor antes de ser atribuído por isso o erro.
O Python está esperando que voce diga qual o valor de X que voce quer usar.

O problema foi feito dessa forma porque o ser humano sabe que quer o X de fora do escopo global, mas o Python tem
esse dilema nas mão a resolver e não tem como adivinhar o que o humano quer, por isso ele tenta resolver dentro do escopo da função
primeiro, mas dentro da função ele encontra o X sem um valor declarado e não sabe se o valor que o humano quer é o de fora ou se ainda vai declara um valor interno na função.

def f():
	x = 5 * x + 7 
	print(x)
    
x = 10
f()

Para este código rodar voce teria que referir ao x interno o valor do X externo
"""
def f(x):
	x = 5 * x + 7
	print(x)

x = 10

f(x)

Tanto é assim que o erro quando ocorre ele mostra este traceback

image.png.d5ea7df641322bbc30b0af66218bc106.png

 

Ao executar a função f() ele se deparou com uma falta de informação em x = 5 * x + 7

adicionado 17 minutos depois

Como eu disse para o Python X é apenas um label para os humanos entenderem e localizarem os valores, mas o que conta para ele é o ID

 

Tanto é que se eu trocar o X do escopo global por outra letra (y), não vai funcionar do mesmo jeito, pois a função não sabe o valor do x.

def f():
    x = 5 * x + 7
    print(x)

y = 10

f()

Agora muda a letra para y dentro da função que o script roda de boa, pois neste caso o y é o único global referenciando internamente na função.

def f():
    x = 5 * y + 7
    print(x)

y = 10

f()

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...