Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 3
Ir a la página 1, 2, 3  Siguiente
 
Funciones Y Parámetros
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Funciones Y Parámetros 
 
Hola!.

Repasando un capitulo sobre parámetros mutables e inmutables en Python.
Se me ocurrió pasar el ejemplo a gambas. Comprobareis la similitud que existen
a veces entre distintos lenguajes.

Os muestro la descripción del ejemplo: ( No os preocupéis en gambas por los términos, mutable e inmutable)

Citar:

Las funciones reciben parametros que pueden ser mutables o inmutables.
Si dentro del cuerpo de la funcion se modifica uno de estos parámetros para que apunte a otro valor, este cambio no se vera reflejado fuera
de la funcion. Si, en cambio se modifica el "contenido" de alguno de estos parametros mutables, este cambio "si" se vera reflejado
fuera de la función.


Este es el código en Gambas:

Public Sub Main()

  Dim lista As Integer[] = [10, 20, 30, 40]
  
  MostrarArray(lista)
  nocambiaarray(lista)
  MostrarArray(lista)
  cambiaarray(lista)
  MostrarArray(lista)
  
End

Public Sub nocambiaarray(lista As Integer[])
  ' Se le asigna a lista otros valores  

  lista = [0, 1, 2, 3]
  MostrarArray(lista)
  
End

Public Sub cambiaarray(lista As Integer[])

  Dim x As Integer
  ' Se le asigna a cada elemento de la lista un valor distinto,
  ' modificando el contenido de la lista
  
  For x = 0 To lista.Max
    lista[x] = x
  Next  
  
End

Public Sub MostrarArray(lista As Integer[])

  Dim x As Integer
  
  ' Mostramos los valores del array
  
  For x = 0 To lista.Max
    If x < lista.Max Then
      Print lista[x]; ",";
    Else
      Print lista[x]
    Endif
  Next  
  Print
  
End
 


Fijaros en la función nocambiaarray.

¿ Por qué no ha cambiado el array lista al asignar un nuevo array al array lista ?.

Ahora fijaros en la función cambiararray:

¿ Por qué modificando cada uno de los elementos  del array lista se logra cambiar el array lista ?.

La salida fue esta:

Citar:

10,20,30,40

0,1,2,3

10,20,30,40

0,1,2,3


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Bien. Si pudiéramos ver la dirección en la que se almacena el array lista antes y después de los cambios veremos que es distinta, por lo tanto,
no apunta al mismo sitio.

Así en la función nocambiaarray, cuando asignamos un nuevo array al array lista, su dirección de memoria es distinta.
En cambio en cambiaarray, la dirección de memoria a la que apunta es la misma que la original.

Vaya..no me sale como quisiera...las direcciones parecen distintas.  

Este es el ejemplo en Python.

#!/usr/bin/python3

''' Parametros mutables e inmutables:

    Las funciones reciben parametros que pueden ser mutables o inmutables.
    Si dentro del cuerpo de la funcion se modifica uno de estos parametros
    para que apunte a otro valor, este cambio no se vera reflejado fuera
    de la funcion. Si, en cambio se modifica el "contenido" de alguno
    de estos parametros mutables, este cambio "si" se vera reflejado
    fuera de la función
'
''

def no_cambia_lista1(lista):
    print (id(lista))
    lista = list(range(len(lista)))
    print (id(lista))
    print (lista)

def no_cambia_lista2(lista):
    for i in range(len(lista)):
        lista[i] = lista[i] ** 3
    print (id(lista))

def main():
    lista = [10, 20, 30, 40]
    no_cambia_lista1(lista)
    print (lista)
    lista = [1, 2, 3, 4]
    no_cambia_lista2(lista)
    print (lista)

if __name__ =='__main__': main()    
 


Salida:

Citar:

3053317964
3053335980
[0, 1, 2, 3]
[10, 20, 30, 40]
3053297548
[1, 8, 27, 64]


Puede que no haya colocado el id en el lugar adecuado.  

id en Python devuelve la identidad o dirección de memoria del objeto

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 22 Septiembre 2015, 19:43; editado 4 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Mutable, inmutable... es el viejo tema del paso por referencia o por valor. No sé por qué se inventan esos nombres raros como para dar más mole al tema.
¿Si le cambio de nombre, una rueda deja de ser una rueda y puedo decir que la he inventado? No sé, no sé...
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Citar:

Mutable, inmutable... es el viejo tema del paso por referencia o por valor. No sé por qué se inventan esos nombres raros como para dar más mole al tema.
¿Si le cambio de nombre, una rueda deja de ser una rueda y puedo decir que la he inventado? No sé, no sé...


No, Jorge, no van los tiros por ahí. En Python al igual que en gambas existen unos tipos de datos y esos tipos se pueden cambiar (mutables)
o no se pueden (inmutables)  una vez que se han definido o creadas.

Así por ejemplo en Python tenemos las listas que son como los arrays. En Python al igual que en gambas puedes cambiar un elemento con asignar
un nuevo valor a ese indice. En cambio en Python existen un tipo de datos parecido a las listas que se llaman Tuplas, que no se pueden cambiar
una vez definida o creada. ( Son inmutables ).

Tanto listas como tuplas se parecen, pero las tuplas digamos que se usan como un array que no va cambiar sus valores.

Las cadenas es lo mismo, una cadena en Python es inmutable una vez creada. No puedes cambiarla, peeero todo tiene su truco.

Bien, volviendo al tema de la función. Sabemos que podemos cambiar el contenido del array dentro de la función y esos valores solo
podrán ser distintos dentro del tiempo de ejecución que dure la función, luego cuando salga de ella, el array volvera a tener sus valores
originales.

Mi pregunta es:

Si "aparentemente" estoy jugando con la misma variable, ¿ como es que no ha cambiado los valores del array en el original ?.
En la función nocambiaarray parece que queremos definir de 0 el array
Y en la función cambiaarray modificamos cada uno de los elementos del array.
Puede que sea esa la respuesta.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
El problema es que python representa esos dos tipos de colección, la tupla y la lista, con diferente sintaxis. Para la primera usa paréntesis y para la segunda corchetes.

La tupla sólo admite un tipo de dato entre sus elementos, mientras que la lista admite distintos tipos mezclados, si mal no recuerdo. Pero en gambas, que yo sepa, no existe una colección inmutable.

EDITO:

Efectivamente la tupla también admite varios tipos de datos mezclados, pero es inmutable, no se pueden modificar sus elementos una vez creada.

https://en.wikibooks.org/wiki/Pytho...mutable_Objects

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Jesús:

No creo, la tupla admite cualquier tipo de dato al igual que la lista. (ya sabes que puede incluso contener a otras tuplas, o listas...)
La sintaxis efectivamente son distintas.

Tanto listas como tuplas pueden admitir datos mezclados, pero no es aconsejable..es un poco lioso.

Os puedo mostrar una tabla de datos mutables y no mutables, pero no puedo tabular directamente en el editor de la comunidad.  
Puedo escanearlo. Como dijo Jesús son colecciones de datos.

Resumiendo Listas y Tuplas.

Tuplas: Son inmutables, se pueden ordenar. Se usan cuando queremos construir una secuencia ordenada que sabemos que no va
a cambiar o que tu quieres usarla como clave en un diccionario o como valor en un conjunto (set)

Listas: Son mutables, se pueden ordenar. La usamos para mantener un seguimiento de una secuencia ordenada que tu quieres actualizar.

¿ Y ahora podemos hablar de lo que pasa en la función del código en gambas ?.  
( Es que nos desviamos y podemos complicar un poco a los demás ).

Ya sea en Python o en gambas, sucede lo mismo.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 22 Septiembre 2015, 20:58; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Tatachan...Vuott a la vista!.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Shordi:

Citar:
Mutable, inmutable... es el viejo tema del paso por referencia o por valor. No sé por qué se inventan esos nombres raros

Yo si lo se.... hay que vender libros      
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Citar:

Yo si lo se.... hay que vender libros


Como decía The Police en una de sus canciones:
Citar:

...
Too much information running through my brain
Too much information driving me insane
..


Supongo que las terminologías en cada lenguaje es distinta, lo bueno es encontrar
la semejanza con otros lenguajes. Si aprendes de uno te valdrá para el otro.

Respecto a la función y la variable lista... ..ejem...
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Miercoles, 23 Septiembre 2015, 13:49; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Funciones Y Parámetros 
 
Citar:

respecto a la función y la variable lista... ..ejem...



El problema está en que esta forma concreta de asignar el valor, es, en realidad, una forma de crear un array, no de rellenarlo sin más.
No sé lo que dice la documentación, pero prueba ésto:

public function listando()

     Dim lista As Integer[] = [10, 20, 30, 40]
  
      lista = [6, 7, 9, 2]
 end


Después de cada una de las dos líneas pregunta en la consola por lista. Verás cómo es diferente en cada línea.
Si sumas el asunto de la visibilidad de las variables, la nueva Lista creada es local, por lo que no afecta a la Lista original.
 




===================
No podemos regresar
 
última edición por shordi el Jueves, 24 Septiembre 2015, 00:26; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Parámetros En Clase Connection Marcelo Bases de Datos 0 Domingo, 09 Octobre 2011, 23:51 Ver último mensaje
Marcelo
No hay nuevos mensajes Ejemplo De Paso De Parámetros Por Referen... Shell General 6 Martes, 12 May 2015, 22:46 Ver último mensaje
vuott
No hay nuevos mensajes Paso De Parámetros A Un Método Guizans General 6 Jueves, 09 Agosto 2018, 00:43 Ver último mensaje
v3ctor
No hay nuevos mensajes Pseint.Argumentos Con Tipos En La Lista De... Shell General 0 Miercoles, 29 Abril 2020, 10:24 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 3
Ir a la página 1, 2, 3  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron