copy.copy(obj) vs obj.copy()

copy.copy(obj) vs obj.copy() - Python - Programmation

Marsh Posté le 17-08-2011 à 22:23:33    

Bonjour,
je me demande quelles sont les différences entre ces deux méthodes de copie d'objet :

Code :
  1. class C(obj):
  2.     def __init__(self, a,b):
  3.         self.a = a
  4.         self.b = b
  5.     def mycopy(self):
  6.         return C(self.a, self.b)
  7. c = C( a=1, b=2 )
  8. # 1ère méthode :
  9. new_obj = c.mycopy()
  10. # 2ème méthode :
  11. import copy
  12. new_obj = copy.copy( c )


Merci de votre aide !
 
edit : copy.deepcopy -> copy.copy


Message édité par suizokukan le 17-08-2011 à 23:15:55

---------------
rule #1 : trust the python
Reply

Marsh Posté le 17-08-2011 à 22:23:33   

Reply

Marsh Posté le 14-12-2011 à 23:17:34    

Le résultat est le même mais la seconde solution est bien plus simple à écrire et à maintenir.
 
Pour obtenir le même résultat avec la première méthode, il faut que ta méthode mycopy() liste tous les attributs de ta classe (peut devenir fastidieux s'il y en a beaucoup) et surtout doit réaliser l'opération de manière récursive sur tous les attributs complexes. Explication:
 

c = C(a=1, b=2)
new_obj = c.mycopy() # OK: la copie est complète
 
c1 = C(a=1, b=2)
c2 = C(a=1, b=c1)
new_obj = c2.mycopy() # La copie est partielle: l'attribut b n'est pas copié


 
Dans la deuxième situation, la copie n'est pas réalisé pour l'attribut b, en voici la preuve en affichant les id des objets:
 

>>> print id(c1)
140459192950864
>>> print id(c2)
140459192950936
>>> print id(new_obj)
140459192951008
>>> print id(new_obj.b)
140459192950864


 
On voit bien que c1 et new_obj.b indiquent le même objet (même id): la copie doit être réalisée de manière récursive. C'est ce que fait copy.copy() (et probablement plus rapidement par dessus le marché)

Reply

Marsh Posté le 12-01-2012 à 21:11:33    

> Merci mistera pour ta réponse qui recoupe l'opinion que j'avais finis par me faire.


---------------
rule #1 : trust the python
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed