Biopython: Echte Kopie erwünscht

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
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Hallo!

Ich habe folgendes Problem. Mit Biopython möchte ich eine Baum-Struktur einlesen (Stammbaum). Der Baum wird, wenn man sich an die Biopython-Doku hält, als <class 'Bio.Phylo.Newick.Tree'> verfügbar gemacht. Das Problem ist nun, dass man davon keine unabhängige Kopie machen kann (#2). In #3 verändere ich den Baum; leider ist davon auch das Backup (#4) betroffen. Ich habe in #2 also nur so was wie einen Zeiger erzeugt und keine unabhänige Kopie. Weiß jemand Rat?

Danke!

Code: Alles auswählen

    from Bio import Phylo
    import sys
    
    #1 read tree with BioPython
    tree = Phylo.read(sys.argv[1], 'newick')    #<class 'Bio.Phylo.Newick.Tree'>
    
    #2 copy?
    backup = tree
    
    #3 modifications
    for clade in tree.find_clades():
        clade.name = "fubar"
    
    #4 problem: backup is fubar
    for clade in backup.find_clades():
        print clade.name              #'fubar'
Zuletzt geändert von RedSharky am Mittwoch 31. Oktober 2012, 18:58, insgesamt 1-mal geändert.
BlackJack

@RedSharky: Falls der Datentyp keine Methode zum kopieren anbietet kann man `copy.deepcopy()` versuchen. Oder Du liest die Daten zweimal ein.

Eine einfache Zuweisung erstellt in Python keine Kopie, sondern bindet nur das *selbe* Objekt an einen anderen/weiteren Namen.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Danke für die schnelle Hilfe!

Mit copy.deepcopy() funktioniert es!!

Hmm, dieses Problem ist mir nie aufgefallen. Wahrscheinlich weil ich nur mir 'einfachen' Datenstrukturen arbeite, und das dort anders ist...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn du mit "einfache" Datenstrukturen unveraenderliche wie Tupel, int, float, str oder unicode meinst: Dann ja.
Wenn du auch Listen dazuzaehlst ...

Code: Alles auswählen

In [1]: a = range(5)

In [2]: b = a

In [3]: b[1] = 42

In [4]: a, b
Out[4]: ([0, 42, 2, 3, 4], [0, 42, 2, 3, 4])

In [5]: a != b
Out[5]: False
Die Semantik ist _immer_ diesselbe, nur immutables verhalten sich scheinbar anders. Das liegt aber nicht an einer anderen Semantik, sondern schlicht daran, dass es nicht auffaellt, weil man sie nicht veraendern kann.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Danke!
Antworten