[Programación]Paso por valor o referencia? En las funciones en Python

Emiliano Gavilan emilianogavilan en gmail.com
Mie Sep 19 17:02:27 ART 2012


El día 19 de septiembre de 2012 16:42, Horacio Castellini
<horacio9573 en yahoo.com.ar> escribió:
> A mi o me engañaron como un niño, o todos los que dicen que en python el
> paso es por referencia versean, pero el siguiente ejemplo muestra que
> depende del tipo de argumento...

No. Lo que si depende del tipo de argumento es la posibilidad o no de
modificar el valor "in place"


> In [2]: def f(x,y):
>    ...:     x=x+3
              ^------------
Aca no se modifica en la misma posicion de memoria; primero el
interprete construye el objeto
de la derecha (x+3), despues se lo asigna (rebind) a x. Despues de
esta operación, x ya no
apunta al objeto original, sino al nuevo. El viejo aun es mantenido si
hay referencias adicionales,
sino es "garbage collected"

>    ...:     y.append(23)
              ^------------
Aca no hay problemas; la variable y no es reasignada a otro objeto,
sino que el objeto
original se modifica "in place"

>    ...:     print x, y
>    ...:
>
> In [3]: x=22
>
> In [4]: y=[22]
>
> In [5]: f(x,y)
> 25 [22, 23]
>
> In [6]: print x,y
> 22 [22, 23]
>
> En (5) se ve que se modificaron los contenidos en la instancia de la
> función, pero fuera de ella (6), solo la lista se ve afectada, entonces, que
> quedamos?? alguien me lo puede aclarar...

Lo podes pensar asi: si hay una asignacion, la referencia al objeto original se
pierde y es reemplazada por el objeto de la derecha del signo igual.

Saludos
Emiliano


Más información sobre la lista de distribución Programacion