Foros del Web » Programando para Internet » Python »

Paso por referencia

Estas en el tema de Paso por referencia en el foro de Python en Foros del Web. Muy buenas, Tengo entendido que en python todos los valores de las variables se pasan por referencia. Estoy haciendo un programa que calcule distancias mas ...
  #1 (permalink)  
Antiguo 17/03/2013, 10:04
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 12 años
Puntos: 0
Paso por referencia

Muy buenas,

Tengo entendido que en python todos los valores de las variables se pasan por referencia.

Estoy haciendo un programa que calcule distancias mas cortas utilizando el algoritmo Aestrella.

Bueno la cosa es que no tengo mucha idea de python y estoy usándolo sin hacer clases ni nada.

La cuestión es tengo esta función :
Código Python:
Ver original
  1. def expandir(matrizCostes,C_lista):
  2.     j=0
  3.     Lista_costos=[]
  4.     Lista_nodos=[]
  5.    
  6.     #print "C_lista:", C_lista[0]
  7.    
  8.     for i in matrizCostes[C_lista]:
  9.         print "La i es: ", i
  10.        
  11.         if i!=0:
  12.             Lista_costos.append(i)
  13.             Lista_nodos.append([j+1])
  14.         j=j+1
  15.  
  16.     print "La lista de costos es: \n", Lista_costos
  17.     print "La lista de nodos es:  \n", Lista_nodos

Y necesito usar las 2 listas Lista_costes y Lista_nodos en otra función.

Como lo hago?
Con un return solo puedo quedarme con una.

Un saludo

Última edición por Macas; 17/03/2013 a las 10:54
  #2 (permalink)  
Antiguo 17/03/2013, 11:35
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Paso por referencia

Con return solamente puedes retornar un solo objeto.

Pero eso no significa que un solo objeto no pueda contener varios objetos.

Código Python:
Ver original
  1. def expandir(matrizCostes,C_lista):
  2.     j=0
  3.     Lista_costos=[]
  4.     Lista_nodos=[]
  5.    
  6.     #print "C_lista:", C_lista[0]
  7.    
  8.     for i in matrizCostes[C_lista]:
  9.         print "La i es: ", i
  10.        
  11.         if i!=0:
  12.             Lista_costos.append(i)
  13.             Lista_nodos.append([j+1])
  14.         j=j+1
  15.  
  16.     print "La lista de costos es: \n", Lista_costos
  17.     print "La lista de nodos es:  \n", Lista_nodos
  18.     return (Lista_costos, Lista_nodos)
  #3 (permalink)  
Antiguo 17/03/2013, 12:07
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 12 años
Puntos: 0
Respuesta: Paso por referencia

Cita:
Iniciado por razpeitia Ver Mensaje
Con return solamente puedes retornar un solo objeto.

Pero eso no significa que un solo objeto no pueda contener varios objetos.

Código Python:
Ver original
  1. def expandir(matrizCostes,C_lista):
  2.     j=0
  3.     Lista_costos=[]
  4.     Lista_nodos=[]
  5.    
  6.     #print "C_lista:", C_lista[0]
  7.    
  8.     for i in matrizCostes[C_lista]:
  9.         print "La i es: ", i
  10.        
  11.         if i!=0:
  12.             Lista_costos.append(i)
  13.             Lista_nodos.append([j+1])
  14.         j=j+1
  15.  
  16.     print "La lista de costos es: \n", Lista_costos
  17.     print "La lista de nodos es:  \n", Lista_nodos
  18.     return (Lista_costos, Lista_nodos)
Gracias no sabia que se podia hacer eso, de todas formas luego como utilitzo esos elementos?
Es decir en la llamada hago variable = expandir(var,var)

Como utilizo las 2 listas?
  #4 (permalink)  
Antiguo 17/03/2013, 12:49
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Paso por referencia

Sería algo así:

Código Python:
Ver original
  1. variable = expandir(var, var)
  2. variable[0] #  Lista_costos
  3. variable[1] #  Lista_nodos

  #5 (permalink)  
Antiguo 17/03/2013, 13:52
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 12 años
Puntos: 0
Respuesta: Paso por referencia

Cita:
Iniciado por carbon Ver Mensaje
Sería algo así:

Código Python:
Ver original
  1. variable = expandir(var, var)
  2. variable[0] #  Lista_costos
  3. variable[1] #  Lista_nodos

Gracias, entonces esta es la manera de usar variables en una función modifacadas en otras?

Y lo de pasar por referencia? Porque esto seria por valor no?
  #6 (permalink)  
Antiguo 17/03/2013, 14:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Paso por referencia

Python usa call by sharing lo cual es bastante parecido a Java.

Básicamente siempre pasas la referencia del objeto, solo toma en cuenta que algunos objetos son mutables y otros son inmutables y eso es todo.

En tu caso puedes hacer 2 cosas.

1.- Si varios métodos comparten variables, entonces una clase probablemente seria una buena idea.
2.- Si solamente es este caso en particular entonces puedes enviar dos parámetros extras. Lista_costos y Lista_nodos, que sean variables que ya tengas antes de la función. Pero no recomiendo mucho este método.
  #7 (permalink)  
Antiguo 18/03/2013, 09:07
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 12 años
Puntos: 0
Respuesta: Paso por referencia

Cita:
Iniciado por razpeitia Ver Mensaje
Python usa call by sharing lo cual es bastante parecido a Java.

Básicamente siempre pasas la referencia del objeto, solo toma en cuenta que algunos objetos son mutables y otros son inmutables y eso es todo.

En tu caso puedes hacer 2 cosas.

1.- Si varios métodos comparten variables, entonces una clase probablemente seria una buena idea.
2.- Si solamente es este caso en particular entonces puedes enviar dos parámetros extras. Lista_costos y Lista_nodos, que sean variables que ya tengas antes de la función. Pero no recomiendo mucho este método.
Ya se que lo mejor y mas eficiente seria usar classes, el problemas es que en este aspecto estoy muy muy verde.

Pero bueno gracias por info

Etiquetas: lista, paso, referencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:14.