Foros del Web » Programando para Internet » Python »

Duda con retorno por valor o por referencia

Estas en el tema de Duda con retorno por valor o por referencia en el foro de Python en Foros del Web. Hola a todos. Tengo una duda respecto a la manera de devolver objetos en python. Por ejemplo, supongamos una clase A con una variable de ...
  #1 (permalink)  
Antiguo 01/12/2014, 06:44
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 10 años, 8 meses
Puntos: 3
Duda con retorno por valor o por referencia

Hola a todos.

Tengo una duda respecto a la manera de devolver objetos en python. Por ejemplo, supongamos una clase A con una variable de tipo diccionario 'a', y tenemos un método:
"def getA(self): return self.__a".

Ese método devuelve una referencia a la variable en cuestión, de manera que si luego cambiamos su valor, cambia también el valor de la variable de la clase.

Mi pregunta es cuál es la manera más recomendada/usada para devolver este tipo de variables, si devolver una referencia como antes, o devolver una copia para que no pueda cambiarse desde fuera de la clase. ("return dict(self.__a)").

Quisiera también saber si en caso de tomar la filosofía de devolver por valor (copias), el rendimiento se resiente por todas las copias que vamos a tener que hacer, o si realmente no se va a notar casi nada.

¿Sería algo recomendable devolver referencias tal cual y en la documentación indicar este asunto?

Saludos, gracias.
  #2 (permalink)  
Antiguo 01/12/2014, 11:01
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con retorno por valor o por referencia

Creo que debes seguir el comportamiento general del lenguaje en el que trabajes.
A nadie va a sorprender que devuelvas una referencia, si por defecto Python asigna referencias en vez de copiar los objetos.

Si te fijás en la biblioteca estándar de Python, vas a encontrar que la asignación es siempre vía referencias, y cuando se requieren copias existen métodos o funciones específicas para hacerlo.

Si yo tengo que usar la función getA(), y sé qué A es un objeto, voy a asumir que lo que voy a obtener es una referencia, porque así funciona el lenguaje. Si quiero obtener una copia, depende de lo que sea A:

* Si está documentado como un tipo incluido en Python (conjunto, diccionario, lista), sé que puedo usar las funciones estándar
* Si es un objeto particular de tu aplicación, deberías proveer una función copy() o similar para A, que me permita obtener una copia.

Ahora, si te interesa que el objeto no cambie fuera de la clase, lo que deberías hacer es no retornarlo, sino que todas las modificaciones necesarias sean hechas a través de métodos del objeto. Como todo, depende de lo que sea realmente A en tu programa, y qué puedas llegar a necesitar hacer con él.

Etiquetas: ip, referencia, retorno, valor
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 15:51.