[Python-de] deepcopy

René Liebscher R.Liebscher at gmx.de
Don Jan 8 10:23:06 CET 2004


Simon Plum schrieb:
> 
> Hallo,
> ich habe ein Problem beim Copieren einer Instance einer komplexen Klasse mit
> deepcopy.
> Immer wenn ich versuche eine Kopie meiner Instance zu erstellen, bekomme ich
> eine Fehlermeldung, dass ein Übergabeparameter fehlt.
> 
> als Beispiel:
> 
> meine Instance heist symbol
> 
> symbol2 = copy.deepcopy(symbol)
> 
> daraus folgt die Meldung:
> .
> .
> .
> .
> .
> File "C:\PYTHON23\lib\copy.py", line 179, in deepcopy
>     y = copier(x, memo)
>   File "C:\PYTHON23\lib\copy.py", line 298, in _deepcopy_inst
>     y = x.__class__(*args)
> TypeError: __init__() takes exactly 2 arguments (1 given)
> 
> Ich habe gelesen, dass ich deepcopy ein Memo übergeben muß, nur kann ich
> leider nicht rausfinden wie man das macht.
> Versucht habe ich es mit "copy.deepcopy(symbol, symbol.__dict__)", aber
> ehrlich gesagt, habe ich noch nicht richtig verstanden, was es mit dem Memo
> auf sich hat und ob ich totalen Blödsinn gemacht habe.
> Kann mir einer helfen?
> Gruss Simon
> 
Also wenn ich http://www.python.org/doc/current/lib/module-copy.html
richtig lese brauchst Du dich nicht um das memo kümmern, das paasiert
nur intern.

Ich vermute mal für eine Kopie wird eine neue Instanz deines Objektes
angelegt.
Und zwar ohne irgendwelche Parameter für den Konstruktor, weil die ja
nicht bekannt sind und copy die internen Werte ja später selbst einfügt.
(Aber da kannst 
Du mit __getinitargs__ Abhilfe schaffen. Siehe obige Webseite weiter
unten.)

Dann ergibt auch die Fehlermeldung Sinn, wenn dein Konstruktor unbedingt
einen Parameter haben will. (Oder irgendeine der Membervariablen?)

Das wäre meine Vermutung, aber zumindest mit Python 2.2 scheint das
nicht die Ursache für dein Problem zu sein. Aber vielleicht weiss ja
jemand ob das in 2.3 jetzt anders ist. (Im Code von 2.2 habe ich
zumindest für das Instanzkopieren keinen Konstruktur aufruf gefunden,
oder den übersehen.)


Übrigens wäre es sinnvoll, nächstes Mal auch den Aufbau deiner Klasse zu
posten, damit man es selber nachvollziehen kann.


MfG
Rene Liebscher

-----------
~> python
Python 2.2.2 (#1, Apr 18 2003, 08:23:15)
[GCC 3.3 20030226 (prerelease) (SuSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...     def __init__(self,x):
...             pass
...
>>> a=A()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: __init__() takes exactly 2 arguments (1 given)
>>> a=A(0)
>>> import copy
>>> b=copy.deepcopy(a)
>>> b
<__main__.A instance at 0x817da8c>
>>>
-----------