deepcopy erzeugt deep confusion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Folgendes scheint zu funktionieren:

Code: Alles auswählen

#!/usr/bin/python
import numpy as n #Arrays
from copy import deepcopy


class Datenblatt(object):

  def __init__(self,zeilen,spalten):
    self.hintergrund = n.ones((zeilen+2,spalten))
    #
    self.zeilen = zeilen
    self.matrix = self.hintergrund[:zeilen,:]
    self.zusatz = self.hintergrund[zeilen:zeilen+2,:]

  def __deepcopy__(self,memo):
    _kopie = deepcopy(super(Datenblatt,self),memo)
    _kopie.matrix = _kopie.hintergrund[:_kopie.zeilen,:]
    _kopie.zusatz = _kopie.hintergrund[_kopie.zeilen:_kopie.zeilen+2,:]
    return _kopie

  def bearbeite(self):
    self.hintergrund *= -1

  def zeige(self):
    print "\n\nStand der Gesamtdaten:"
    print '\n', self.hintergrund
    print '\n\n', self.matrix, '\n\n', self.zusatz



muster = Datenblatt(zeilen=4,spalten=8)
#
#blatt = muster #funktioniert
blatt = deepcopy(muster) #funktioniert jetzt auch, aber nur wegen __deepcopy__

blatt.zeige()
#
blatt.matrix[1,1] = -2
blatt.zusatz *= 2
blatt.matrix += 5
blatt.zeige()
#
blatt.bearbeite()
blatt.zeige()
Natürlich ist das IMHO keineswegs zufriedenstellend, da wir bei jeder Klasse raten/testen/nachforschen müssen, ob deepcopy nun funktioniert oder nicht. Aber vielleicht können wir voraussetzen, dass derlei Undinge nur bei Numeric oder NumPy geschehen.

Bei NumPy selber konnte ich nichts melden, das ist eine 99% geschlossene Gesellschaft, da kommen nur Hacker oder Insider durch (bitte als Lob für dieses Python-Forum auslegen).
BlackJack

Ich hatte von der NumPy Mailingliste bis jetzt nur positives gehört. Geschlossene Gesellschaft war da nicht bei!?
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Goswin hat geschrieben:In deinem Beispiel wird das d natürlich mitkopiert; nur so kannst du b verändern, ohne dass sich a gleich mitverändert.
So ist es aber gar nicht. a wird verändert, b nicht.

Und meinst du wirklich, in A.do_something wird ein anderes globales d verwendet, je nachdem, ob man a.do_something oder b.do_something ausührt?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Goswin hat geschrieben:Natürlich ist das IMHO keineswegs zufriedenstellend, da wir bei jeder Klasse raten/testen/nachforschen müssen, ob deepcopy nun funktioniert oder nicht. Aber vielleicht können wir voraussetzen, dass derlei Undinge nur bei Numeric oder NumPy geschehen.
Ich habs doch eben schon versucht zu erklären: Das liegt nicht an numpy. Das liegt an deinem Problem. Das ist eben nicht-trivial. Jede der von mir aufgezählen drei Kopien hat seine Daseinsberechtigung und das Numpy-Team musste sich nunmal für eine entscheiden(und wenns sie es nicht getan haben ist gegen das derzeitige Verhalten trotzdem nix einzuwenden). Genau aus diesem Grund gibt es die __copy__ Methode. Damit du eine speziell auf dein Problem zugeschnittene Kopien erstellen kannst.

Das Problem kann dir bei jeder x-beliebigen Bibliothek begegnen.

Das einzige, was man vielleicht machen könnte, ist eine kleine Warnung in die Python-Anleitung zu schreiben, dass deepcopy eben nicht "einfach so" funktioniert.
Antworten