|
Página 1 de 3
|
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
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"
|
#1 Martes, 22 Septiembre 2015, 19:25 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#2 Martes, 22 Septiembre 2015, 19:32 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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
|
#3 Martes, 22 Septiembre 2015, 19:57 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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"
|
#4 Martes, 22 Septiembre 2015, 20:14 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
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"
|
#5 Martes, 22 Septiembre 2015, 20:21 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#6 Martes, 22 Septiembre 2015, 20:58 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Funciones Y Parámetros
Tatachan...Vuott a la vista!.
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#7 Martes, 22 Septiembre 2015, 20:59 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
|
#8 Miercoles, 23 Septiembre 2015, 07:21 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#9 Miercoles, 23 Septiembre 2015, 13:48 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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:
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
|
#10 Miercoles, 23 Septiembre 2015, 14:30 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 3
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|