globales python local-variables

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()