[Python-de] Newbie: Kopie eines Objektes

Martin v. Loewis martin at loewis.home.cs.tu-berlin.de
Tue Mar 13 13:00:12 EST 2001


> Ich habe folgende Klasse:
> 
> class CPoint:
>     def __init__(self,x,y,z):
>         self.x = x
>         self.y = y
>         self.z = z
> 
> 
> Ich bilde daraus die Instanz:
> 
> pt1 = CPoint(1,2,3)
> 
> Die Referenz ist klar:
> 
> pt2=pt1
> 
> Aber auch dies bildet eine Refernz (wahrscheinlich auf die Eigenschaften):
> 
> pt2 = CPoint(pt1.x,pt1.y,pt1.z).

Nein, das erzeugt ein neues Objekt; dessen Attribute sind die
Referenzen auf die gleichen Attribute wie die vom Originalobjekt.
Das nennt man eine flache Kopie (shallow copy).

> WIE BEKOMME ICH EINE KOPIE?

Kommt drauf an. Wenn Du alle beteiligten Typen kennst, könntest Du
eine copy-Methode definieren:


class CPoint:
    def __init__(self,x,y,z):
         self.x = x
         self.y = y
         self.z = z

    def copy(self):
         return CPoint(self.x,self.y,self.z)

Falls x, y und z auch kopiert werden sollen, schreibst Du

class CPoint:
    def __init__(self,x,y,z):
         self.x = x
         self.y = y
         self.z = z

    def copy(self):
         return CPoint(self.x.copy(),self.y.copy(),self.z.copy())

Dann ergibt sich das Problem zyklischer Strukturen usw.

Falls Du sicher bist, dass Du eine *ganz* tiefe Kopie brauchst auch
von Objekten, deren Typen Du nicht kennst, schreibst Du

pt1 = CPoint(1,2,3)
from copy import deepcopy
pt2 = deepcopy(pt1)

Das kann auch Zyklen ab; es kopiert aber u.U. mehr als Du willst.

Ciao,
Martin



More information about the Python-de mailing list