paso de Variables por referencia a funciones

Hernan Martínez Foffani hernan en orgmf.com.ar
Mie Oct 22 22:48:22 CEST 2003


>> es la eterna discusión. :-)
>> el problema se agrava porque hay diversas interpretaciones de lo que
>> significa "pasar por referencia" o "pasar por valor". no entraré en
>> ello. para un no iniciado lo mejor es cambiar el chip cuanto antes.
>>
>> (quizás pueda ayudar leer
>> http://www.orgmf.com.ar/condor/objectthink.html )
>
> A mí me ayuda mucho el hecho de pensar en objetos mutables e
> inmutables, y nunca pensar en copias sino en "asignaciones". Si
> tenemos en cuenta después que un objeto inmutable no puede cambiar de
> valor "sin cambiar de sitio en la memoria"[1], acaba uno por entender
> qué cosas cambiarán si las pasamos a una función y cuales no.
> ...
> [1] Con esto me refiero a que los objetos inmutables no poseen
> métodos que los modifiquen, por lo que se necesita una asignación
> para "cambiarlos" (x = x+1) y eso timplica que "cambien de sitio en
> la memoria"

lo de mutabilidad es correcto. y decís bien en tu tutorial que
es un concepto importante que no se explica mucho.
lo de "cambiarlos de sitio" no me gusta tanto porque parecería
que es el mismo objeto que se está moviendo y no es así.

ej:
>>> x = 4
>>> y = 5
>>> z = x + 1
>>> id(x)
7954432
>>> id(y)
7954240
>>> id(z)
7954240
>>>

en palabras:
 - se creó el objeto "4", se lo asoció con el nombre "x".
 - se creó el objeto "5", se lo asoció con el nombre "y".
 - la expresion devolvió el objeto "5", se lo asoció a "z"
el objeto "5" es el mismo tanto en "y" como en "z" no fue
creado, ni movido, ni copiado en la línea "z=x+1".
el objeto "4" no se cambio al "5", los dos siguen vivos.

es un comportamiento particular, no tiene que ver con mutabilidad,
pero que es facil de explicar con la abstraccion "Nombre asociado_a
Objeto".

si ese concepto es complicado para un no iniciado se
puede usar la idea de "muebles" (objetos) y "postit" (nombres)
pegar una etiqueta a un mueble es enlazar el nombre con el
objeto. un monitor por ejemplo, puede tener pegados muchos postit
pero para cambiarlo debo quitarle primero todas las etiquetas pegadas
(inmutabilidad). a los "cajones" (colecciones) también se les pueden
pegar etiquetas pero puedo poner o quitar cosas dentro sin tener que
cambiar de postit (mutabilidad). cualquier "cosa" que no tenga
pegada una etiqueta es pasible de ser recolectada por el ordenanza.
y así..

por eso insisto que es preferible cambiar de chip y dejar de pensar
en variables, pasar por valor, etc. etc.
o mejor dicho, al principio se puede programar tranquilamente en
python como si estuvieras programando en basic. pero cuando algunas
cosillas no funcionan como esperas ahí sí es mejor cambiar el chip.

saludos,
-H.




Más información sobre la lista de distribución Python-es