Seite 1 von 1

Biopython: Echte Kopie erwünscht

Verfasst: Mittwoch 31. Oktober 2012, 18:53
von RedSharky
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'

Re: Biopython: Echte Kopie erwünscht

Verfasst: Mittwoch 31. Oktober 2012, 18:57
von 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.

Re: Biopython: Echte Kopie erwünscht

Verfasst: Mittwoch 31. Oktober 2012, 19:13
von RedSharky
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...

Re: Biopython: Echte Kopie erwünscht

Verfasst: Mittwoch 31. Oktober 2012, 21:29
von cofi
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.

Re: Biopython: Echte Kopie erwünscht

Verfasst: Donnerstag 1. November 2012, 08:24
von RedSharky
Danke!