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

Horacio Castellini horacio9573 en yahoo.com.ar
Jue Sep 20 07:50:32 ART 2012





________________________________
 De: Fabian Ezequiel Gallina <galli.87 en gmail.com>
Para: programacion en lugro.org.ar 
Enviado: miércoles, 19 de septiembre de 2012 20:45
Asunto: Re: [Programación]Paso por valor o referencia? En las funciones en Python
 
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...
>
> In [2]: def f(x,y):
>    ...:     x=x+3
>    ...:     y.append(23)
>    ...:     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...
>

Más alla del tono despectivo con el cual dirigís tus preguntas y lo
poco bien parado que te deja en general afrontar los asuntos de tal
manera te lo voy a responder cortito y al pié. 
---------------
Perdón...!! vos a mi me criticas los comentarios,,, es como si Menguele me acusara de genocida... 

--------------
En Python todo es una
referencia, sin embargo hay objetos que son mutables (proveen métodos
a través de los cuales se pueden modificar) y otros que son
inmutables. Es a estos últimos por su característica de ser que no
pueden ser modificados y cualquier operación sobre ellos termina
resultando en un nuevo objeto generado a partir del original pero
diferente a él.

Los types mutables que son built-in son: list, dict (y el nuevo bytearray).
Los inmutables, como habrás imaginado son: int, string, tuple,
complex, float, bool.

Con esto nuevo que ahora sabés, por qué es que tu ejemplo no le cambia
la valor al x original?

-----------------------------------

Si un objeto int fuera inmutable como una tupla o un string,, donde el "=" crea otro objeto inmutable, y a cada copia debería estar asignada a areas de memoria distinta, esto debería causar un memory overflow, por ejemplo en un código como este...

x=0
while True:
    x=x+3


Si es cierto lo que alguna vez me dijo Emi que el python usa el sustrato de C, entonces como en C siempre el pasaje es por valor cosa queda mas clara, ya que en C sería el equivalente a :

bool f( int x, list **y){
        list *q__, *p__;
        x+=3;
        for(p__=*y;p__->next!=(list*)0;p__=p__->next);
        q__=(list*)malloc(sizeof(list));
        q__->next=(list*)0;
        q__->date=23;
        p__->proximo=q;
        retutn Null
}
      
Donde se emula un pasaje por referencia que no es tal...
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lugro.org.ar/pipermail/programacion/attachments/20120920/abf6d2b8/attachment.htm>


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