Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/05/2015, 23:22
TriN
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Duda con funcionamiento de listas de objetos

Buenas noches comunidad de foros de web, estoy aprendiendo un poco de la POO en python, estoy siguiendo los videotutoriales del sr Jésus Conde por su canal de youtube, sin embargo en uno de los ejercicios planteados por el, tengo una pequeña duda el crear una lista de objetos, en si el ejercicio trata sobre un cuaderno donde se pueden guardar diversas notas y este es el código funcionando

Código Python:
Ver original
  1. import datetime
  2. n_id=0
  3.  
  4. class nota:
  5.     def __init__(self,info,eti=''):
  6.         '''Método constructor que posee dos parámetros, información de la nota, y la etiqueta es opcional'''
  7.         self.info=info
  8.         self.eti=eti
  9.         self.creation=datetime.date.today()
  10.         global n_id
  11.         n_id+=1
  12.         self.id=n_id
  13.  
  14.     def search(self,cadena):
  15.         '''Metódo para buscar información en alguna nota'''
  16.         return  cadena in self.info or cadena in self.eti
  17.  
  18. class cuaderno:
  19. '''Metódo contructor para crear la lista de notas'''
  20.     def __init__(self):
  21.         self.notas=[]
  22.  
  23.     def nuevaNota(self,info,eti=''):
  24.         self.notas.append(nota(info,eti))
En ese código planteado puedo acceder a los diversos atributos de la clase sin problemas a través de la lista de objetos, sin embargo para aumentar mis conocimientos quise hacerlo de esta forma que funciona igualmente pero me ha surgido una duda:

Código Python:
Ver original
  1. import datetime
  2. n_id=0
  3.  
  4. class nota:
  5.     def __init__(self,info,eti=''):
  6.         '''Metódo constructor que posee dos parámetros, información de la nota, y la etiqueta es opcional'''
  7.         self.info=info
  8.         self.eti=eti
  9.         self.creation=datetime.date.today()
  10.         global n_id
  11.         n_id+=1
  12.         self.id=n_id
  13.  
  14.     def search(self,cadena):
  15.         '''Metódo para buscar información en alguna nota'''
  16.         return  cadena in self.info or cadena in self.eti
  17.  
  18. class cuaderno:
  19.     def __init__(self):
  20.         '''Metódo contructor para crear la lista de notas'''
  21.         self.notas=[]
  22.  
  23.     def nuevaNota(self,info,eti=''):
  24.  
  25.         self.objetonuevo=nota(info)
  26.         self.notas.append(self.objetonuevo)

Como pueden visualizar lo que cambia es esta parte del codigo:

Código Python:
Ver original
  1. def nuevaNota(self,info,eti=''):
  2.  
  3.         self.objetonuevo=nota(info)
  4.         self.notas.append(self.objetonuevo)

Mi duda es la siguiente, usar el metódo nuevaNota se agregan mas objetos a la lista y se puede visualizar los atributos de los objetos a través de los subíndices sin embargo el objeto self.objetonuevo se queda con los últimos atributos asignados al llamar al metódo nuevaNota, hay es donde viene mi pregunta ¿Al agregar el objeto a la lista, se hace un copia del objeto a la lista? He probado verificando los valores de la memoria a través del prompt y no es una copia por que la dirección de memoria siempre es igual al ultimo objeto insertado en la lista les dejo la prueba que realicé instanciando un objeto llamado x y su valor de memoria:

Código Python:
Ver original
  1. x.notas
  2. [<__main__.nota object at 0x7f5735053390>, <__main__.nota object at 0x7f5734ff8be0>, <__main__.nota object at 0x7f5734ff8e80>]
  3.  
  4. __main__.nota object at 0x7f5734ff8e80>
  5. >>> x.objetonuevo

Como pueden darse cuenta la dirección de memoria del objeto es la misma que la del ultimo elemento de la lista de objetos, en fin ¿Los objetos son inmutables? ¿Al instanciar un objeto con el mismo nombre se hace referencia con otro valor de memoria al nombre del objeto? ¿La listas en si guardan direcciones de memoria y no nombres de objetos? Gracias de antemano por su ayuda