¿Cómo paso variables entre funciones? [duplicar]
Quiero pasar valores (como variables) entre diferentes funciones.
Por ejemplo, asigno valores a una lista en una función, luego quiero usar esa lista en otra función:
list = []
def defineAList():
list = ['1','2','3']
print "For checking purposes: in defineAList, list is",list
return list
def useTheList(list):
print "For checking purposes: in useTheList, list is",list
def main():
defineAList()
useTheList(list)
main()
Esperaría que esto hiciera lo siguiente:
- Inicialice 'lista' como una lista vacía; llamar a main (esto, al menos, sé que lo hice bien...)
- Dentro de defineAList(), asigne ciertos valores a la lista; luego pase la nueva lista nuevamente a main()
- Dentro de main(), llame a useTheList(list)
- Dado que 'lista' está incluida en los parámetros de la función useTheList, esperaría que useTheList ahora use la lista definida por defineAList(), NO la lista vacía definida antes de llamar a main.
Sin embargo, mi resultado es:
For checking purposes: in defineAList, list is ['1', '2', '3']
For checking purposes: in useTheList, list is []
"regresar" no hace lo que esperaba. ¿Qué es lo que hace? ¿Cómo tomo la lista de defineAList() y la uso dentro de useTheList()?
No quiero utilizar variables globales.
Esto es lo que realmente está pasando:
global_list = []
def defineAList():
local_list = ['1','2','3']
print "For checking purposes: in defineAList, list is", local_list
return local_list
def useTheList(passed_list):
print "For checking purposes: in useTheList, list is", passed_list
def main():
# returned list is ignored
returned_list = defineAList()
# passed_list inside useTheList is set to global_list
useTheList(global_list)
main()
Esto es lo que quieres:
def defineAList():
local_list = ['1','2','3']
print "For checking purposes: in defineAList, list is", local_list
return local_list
def useTheList(passed_list):
print "For checking purposes: in useTheList, list is", passed_list
def main():
# returned list is ignored
returned_list = defineAList()
# passed_list inside useTheList is set to what is returned from defineAList
useTheList(returned_list)
main()
Incluso puedes omitir el temporal returned_list
y pasar el valor devuelto directamente a useTheList
:
def main():
# passed_list inside useTheList is set to what is returned from defineAList
useTheList(defineAList())
Sólo te falta un paso crítico. Debe pasar explícitamente el valor de retorno a la segunda función.
def main():
l = defineAList()
useTheList(l)
Alternativamente:
def main():
useTheList(defineAList())
O (¡aunque no deberías hacer esto! Puede parecer agradable al principio, pero los globales simplemente te causan dolor a largo plazo):
l = []
def defineAList():
global l
l.extend(['1','2','3'])
def main():
global l
defineAList()
useTheList(l)
La función devuelve un valor, pero no crea el símbolo en ningún tipo de espacio de nombres global como supone su código. En realidad, debe capturar el valor de retorno en el alcance de la llamada y luego usarlo para operaciones posteriores.
return
devuelve un valor. No importa el nombre que le hayas dado a ese valor. Al devolverlo simplemente "se desmaya" para que otra persona pueda usarlo. Si quieres usarlo, debes agarrarlo desde afuera:
lst = defineAList()
useTheList(lst)
Regresar list
desde adentro defineAList
no significa "hacer que el resto del programa pueda usar esa variable". Significa "pasar el valor de esta variable y darle al resto del programa la oportunidad de tomarlo y usarlo". Debe asignar ese valor a algo fuera de la función para poder utilizarlo. Además, debido a esto, no es necesario definir su lista de antemano con list = []
. Dentro defineAList
, creas una nueva lista y la devuelves; esta lista no tiene relación con la que definiste list = []
al principio.
Por cierto, cambié el nombre de tu variable de list
a lst
. No es una buena idea usarlo list
como nombre de variable porque ese ya es el nombre de un tipo integrado de Python. Si crea su propia variable llamada list
, ya no podrá acceder a la incorporada.
Tu devolución no sirve de nada si no la asignas
list=defineAList()