¿Cómo paso variables entre funciones? [duplicar]

Resuelto user2113818 asked hace 11 años • 8 respuestas

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:

  1. Inicialice 'lista' como una lista vacía; llamar a main (esto, al menos, sé que lo hice bien...)
  2. Dentro de defineAList(), asigne ciertos valores a la lista; luego pase la nueva lista nuevamente a main()
  3. Dentro de main(), llame a useTheList(list)
  4. 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.

user2113818 avatar Apr 17 '13 00:04 user2113818
Aceptado

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_listy pasar el valor devuelto directamente a useTheList:

def main():
    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(defineAList()) 
Pavel Anossov avatar Apr 16 '2013 18:04 Pavel Anossov

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.

Silas Ray avatar Apr 16 '2013 17:04 Silas Ray

returndevuelve 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 listdesde adentro defineAListno 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 lista lst. No es una buena idea usarlo listcomo 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.

BrenBarn avatar Apr 16 '2013 17:04 BrenBarn

Tu devolución no sirve de nada si no la asignas

list=defineAList()
bobrobbob avatar Apr 16 '2013 17:04 bobrobbob