<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div><span><br></span></div><div><br></div> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div dir="ltr"> <font face="Arial" size="2"> <hr size="1"> <b><span style="font-weight:bold;">De:</span></b> Fabian Ezequiel Gallina <galli.87@gmail.com><br> <b><span style="font-weight: bold;">Para:</span></b> programacion@lugro.org.ar <br> <b><span style="font-weight: bold;">Enviado:</span></b> miércoles, 19 de septiembre de 2012 20:45<br> <b><span style="font-weight: bold;">Asunto:</span></b> Re: [Programación]Paso por valor o referencia? En las funciones en Python<br> </font> </div> <br>El día 19 de septiembre de 2012 16:42, Horacio Castellini<br><<a ymailto="mailto:horacio9573@yahoo.com.ar"
href="mailto:horacio9573@yahoo.com.ar">horacio9573@yahoo.com.ar</a>> escribió:<br>> A mi o me engañaron como un niño, o todos los que dicen que en python el<br>> paso es por referencia versean, pero el siguiente ejemplo muestra que<br>> depende del tipo de argumento...<br>><br>> In [2]: def f(x,y):<br>> ...: x=x+3<br>> ...: y.append(23)<br>> ...: print x, y<br>> ...:<br>><br>> In [3]: x=22<br>><br>> In [4]: y=[22]<br>><br>> In [5]: f(x,y)<br>> 25 [22, 23]<br>><br>> In [6]: print x,y<br>> 22 [22, 23]<br>><br>> En (5) se ve que se modificaron los contenidos en la instancia de la<br>> función, pero fuera de ella (6), solo la lista se ve afectada, entonces, que<br>> quedamos?? alguien me lo puede aclarar...<br>><br><br>Más alla del tono despectivo con el cual dirigís tus preguntas y
lo<br>poco bien parado que te deja en general afrontar los asuntos de tal<br>manera te lo voy a responder cortito y al pié. <br>---------------<br>Perdón...!! vos a mi me criticas los comentarios,,, es como si Menguele me acusara de genocida... <br><br>--------------<br>En Python todo es una<br>referencia, sin embargo hay objetos que son mutables (proveen métodos<br>a través de los cuales se pueden modificar) y otros que son<br>inmutables. Es a estos últimos por su característica de ser que no<br>pueden ser modificados y cualquier operación sobre ellos termina<br>resultando en un nuevo objeto generado a partir del original pero<br>diferente a él.<br><br>Los types mutables que son built-in son: list, dict (y el nuevo bytearray).<br>Los inmutables, como habrás imaginado son: int, string, tuple,<br>complex, float, bool.<br><br>Con esto nuevo que ahora sabés, por qué es que tu ejemplo no le cambia<br>la valor al x
original?<br><br>-----------------------------------<br><br>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...<br><br>x=0<br>while True:<br><span class="tab"> x=x+3<br><br></span><br>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 :<br><br>bool f( int x, list **y){<br><span class="tab"> </span><span class="tab"> list *q__</span>, *p__;<br><span class="tab"> </span><span class="tab"> </span><span class="tab">x+=3;<br></span><span class="tab"> </span><span class="tab">
</span>for(p__=*y;p__->next!=(list*)0;p__=p__->next);<br><span class="tab"> </span><span class="tab"> </span>q__=(list*)malloc(sizeof(list));<br><span class="tab"> </span><span class="tab"> </span>q__->next=(list*)0;<br><span class="tab"> </span><span class="tab"> </span>q__->date=23;<br><span class="tab"> </span><span class="tab"> </span>p__->proximo=q;<span class="tab"></span><span class="tab"><br></span><span class="tab"> </span><span class="tab"> </span><span class="tab">retutn Null</span><br>}<br> <br>Donde se emula un pasaje por referencia que no es tal...<br> </div> </div> </div></body></html>