variables globales python
Acceda a una variable de función fuera de la función sin usar `global` (5)
Estoy intentando acceder a una variable de función local fuera de la función en Python. Así por ejemplo,
bye = ''''
def hi():
global bye
something
something
bye = 5
sigh = 10
hi()
print bye
Lo anterior funciona bien como debería. Como quiero saber si puedo acceder a bye
fuera de hi()
sin usar global bye
, lo intenté:
def hi():
something
something
bye = 5
sigh = 10
return
hi()
x = hi()
print x.bye
Lo anterior le da a AttributeError: ''NoneType'' object has no attribute ''bye''
.
Entonces, lo intenté:
def hi():
something
something
bye = 5
sigh = 10
return bye
hi()
x = hi()
print x.bye
Esta vez ni siquiera da un error.
Entonces, ¿hay una manera de acceder a una variable de función local ( bye
) fuera de su función ( hi()
) sin usar globales y sin imprimir sigh
variables también? (La pregunta se editó para incluir un sigh
después del comentario de @hcwhsa a continuación.
El problema es que estabas llamando a print x.bye después de configurar x como una cadena. Cuando ejecuta x = hi()
ejecuta hi () y establece el valor de x en 5 (el valor de bye; NO establece el valor de x como una referencia a la propia variable de bye). EX: bye = 5; x = bye; bye = 4; print x;
bye = 5; x = bye; bye = 4; print x;
impresiones 5, no 4
Además, no tiene que ejecutar hi () dos veces, simplemente ejecute x = hi()
, no hi();x=hi()
(de la forma en que lo tenía, estaba corriendo hi (), sin hacer nada con el el valor resultante es 5 y luego vuelve a ejecutar el mismo hi () y guarda el valor 5 en la variable x.
Así que el código completo debería ser
def hi():
something
something
bye = 5
return bye
x = hi()
print x
Si desea devolver varias variables, una opción sería utilizar una lista o un diccionario, según lo que necesite.
ex:
def hi():
something
xyz = { ''bye'': 7, ''foobar'': 8}
return xyz
x = hi()
print x[''bye'']
más información sobre los diccionarios de Python en http://docs.python.org/2/tutorial/datastructures.html#dictionaries
He experimentado el mismo problema. Una de las respuestas a su pregunta me llevó a la siguiente idea (que finalmente funcionó). Yo uso Python 3.7.
# just an example
def func(): # define a function
func.y = 4 # here y is a local variable, which I want to access; func.y defines
# a method for my example function which will allow me to access
# function''s local variable y
x = func.y + 8 # this is the main task for the function: what it should do
return x
func() # now I''m calling the function
a = func.y # I put it''s local variable into my new variable
print(a) # and print my new variable
Luego lanzo este programa en Windows PowerShell y obtengo la respuesta 4. Conclusión: para poder acceder a una variable de una función local, se puede agregar el nombre de la función y un punto antes del nombre de la variable local (y luego, por supuesto, use esta construcción para llamar a la variable tanto en el cuerpo de la función como fuera de ella). Espero que esto sea de ayuda.
Podrías hacer algo en esta línea:
def static_example():
if not hasattr(static_example, "static_var"):
static_example.static_var = 0
static_example.static_var += 1
return static_example.static_var
print static_example()
print static_example()
print static_example()
Puedes hacer algo en este sentido (que funcionó tanto en Python v2.7.14 como en v3.6.3 cuando lo probé / ellos):
def hi():
# other code...
hi.bye = 42 # Create function attribute.
sigh = 10
hi()
print(hi.bye) # -> 42
Las funciones son objetos en Python y pueden tener atributos arbitrarios asignados a ellos.
Si va a hacer este tipo de cosas a menudo, podría implementar algo más genérico al crear un decorador de funciones que agregue un argumento a cada llamada a la función decorada. Este argumento le dará a las funciones una forma de referenciarse a sí mismas y es similar a los métodos de clase de argumento de instancia que se reciben automáticamente como su primer argumento que normalmente se denomina "yo": elegí el nombre para evitar confusión. Se puede nombrar como desees.
Aquí hay un ejemplo de ese enfoque:
def with_this(func):
def wrapped(*args, **kwargs):
return func(wrapped, *args, **kwargs)
return wrapped
@with_this
def hi(this, that):
# other code...
this.bye = 2 * that # Create function attribute.
sigh = 10
hi(21)
print(hi.bye) # -> 42
def hi():
bye = 5
return bye
print hi()