Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Dudas con parámetros(mutables/lista) en función con python.
#1
Hola, que tengan un muy buen día.
Los molesto porque por más que leo y releo la explicación que da el autor del libro con el que estoy aprendiendo python no logro entenderlo, ¿porque lista2 es la única que no se ven reflejados los cambios al salir de la función? .-
Código:
def modifica(a, b):
    a.append(4)
    b = b + [4]
    print(f"\n Lista 2 en la función...: {b}")
    return b

lista1 = [1, 2, 3]
lista2 = [1, 2, 3]

lista3 = modifica(lista1, lista2)

print(f"\n Lista 1...: {lista1}")
print(f" Lista 2...: {lista2}")
print(f" Lista 3...:, {lista3}")
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola,
eso es un problema de direcciones de memoria. Te pongo un ejemplo, basado en el tuyo, que es autoexplicativo:


Código:
def modifica(a, b):
   a.append(4)
   b = b + [4]
   print(f"\n Lista 2 en la función...: {b}")
   return b

lista1 = [1, 2, 3]
lista2 = [1, 2, 3]

lista3 = modifica(lista1, lista2)
print(lista1)   # --> [1, 2, 3, 4]
print(lista2)   # --> [1, 2, 3]
print(lista3)   # --> [1, 2, 3, 4]

# no modifica la lista2 por un tema de direcciones de memoria.
# por. ejemplo:
lista4 = lista2    
# ahora el primer elemento de cada lista tiene la misma dirección de memoria
# var1 = var2 no asigna el mismo valor en diferentes zonas de memoria, sino que
# asigna la misma dirección de memoria
# cambiemos la lista4
lista4.append("juan")
# y ahora veamos que ha pasado
print(lista4)   # --> [1, 2, 3, 'juan']
print(lista2)   # --> [1, 2, 3, 'juan']
# Sorpresa ...
#las dos listas se han modificado porque los dos nombres de variable
# a efectos internos ocupan la misma dirección, y por decirlo de alguna manera
# para la máquina lista4 y lista2 es la misma variable. Es el problema de la igualdad con las variables
# ¿como soludcionar esto?
# con copy.deepcopy
import copy
lista5 = copy.deepcopy(lista4)
lista5.append("manolo")
print(lista4)   # --> [1, 2, 3, 'juan']
print(lista5)   # --> [1, 2, 3, 'juan', 'manolo']


espero que resuelva tus dudas. no es lo mismo var = var+ elem  que var.append(elem)
en tu ejemplo cuando imprimes la lista dentro de la función, está en otra zona de memoria distinta de la de la función principal, e imprime la zona de memoria de la funcion. Es lo que llaman los expertos la pila de instrucciones cuando se arranca un programa, que no es otra cosa que una zona reservada dentro de los distintos apartados que permiten su ejecución.
saludos.
Responder
#3
Hola  calvicius.
Gracias por el aporte, me ayudo muchísimo a entender el tema. desconocía copy.deepcopy, me tenía un tanto desconcertado como utiliza las direcciones de memoria python pero seguramente continuando con el manual se aclarara del todo el panorama. -
El siguiente código me está ayudando a entender que pasa con y sin return en las funciones. - 
Código:
def modUno(a):
     a += 1
     print(f"\n A en la funcion CON return............: {id(a)}")
     return a

def modDos(b):
     b += 1
     print(f"\n B en el procedimiento SIN return......: {id(b)}")

a = modUno(5)
print(f"\n A fuera de la función CON return......: {id(a)}")

b = 7
modDos(b)
print(f"\n B fuera del procedimiento SIN return..: {id(b)}")
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)