Seite 1 von 1

Problem mit verschachtelten Datenstrukturen

Verfasst: Donnerstag 17. Januar 2013, 15:53
von gangfish
Hi,

hab da ein Problem mit meiner Datenstruktur die wie folgt aussieht:

Code: Alles auswählen

_lv = { 'name_lv' : None,
        'desc_lv' : None,
        'le' : []
        }

_le = { 'name_le' : None,
        'date' : None,
        'numb' : 0,
        'tag'  : [],
        'abs'   : []
        }

_tag = {'name_tag' : None,
        'desc_tag' : None
        }

_abs = {'name_abs' : None,
        'desc_abs' : None,
        'thema': { 'name_thema' : None,
                   'desc_thema' : None},
        'frage': []
        }

_frage = {'desc_frage' : None,
          'antw' : {'desc_antw' : None}
       }

db = list()
so eine leere Liste erzeuge ich noch dazu.

So ich füge meiner db nun ein paar daten hinzu z.B:

Code: Alles auswählen

new_lv1 = _lv.copy()
new_lv2 = _lv.copy()
new_lv3 = _lv.copy()
new_lv1['name_lv'] = 'LV1'
new_lv1['desc_lv'] = 'LV1_DESC'

new_lv2['name_lv'] = 'LV2'
new_lv2['desc_lv'] = 'LV2_DESC'

new_lv3['name_lv'] = 'LV3'
new_lv3['desc_lv'] = 'LV3_DESC'

db.append(new_lv1)
db.append(new_lv2)
db.append(new_lv3)
print db[0]
print db[1]
print db[2]
Ausgabe:

Code: Alles auswählen

{'name_lv': 'LV1', 'desc_lv': 'LV1_DESC', 'le': []}
{'name_lv': 'LV2', 'desc_lv': 'LV2_DESC', 'le': []}
{'name_lv': 'LV3', 'desc_lv': 'LV3_DESC', 'le': []}
soweit so gut, dass klappt auch, ich hab dann 3 listen elemente mit unterschiedlichen namen und beschreibungen
Wenn ich jetzt allerdings in die leere Liste, die jedes Element meiner Hauptliste beinhaltet, Daten reinschreibe werden die neuen Daten in alle Elemente meiner hauptliste hinzugefügt, dies sollte aber nicht sein. hier der Code:

Code: Alles auswählen

new_le = _le.copy()
new_le['name_le'] = 'LE'
new_le['date'] = '10.10.2013'
new_le['numb'] = 1
db[1]['le'].append(new_le)
print db[0]
print db[1]
print db[2]
Als ausgabe erhalte ich:

Code: Alles auswählen

{'name_lv': 'LV1', 'desc_lv': 'LV1_DESC', 'le': [{'date': '10.10.2013', 'name_le': 'LE', 'tag': [], 'abs': [], 'numb': 1}]}
{'name_lv': 'LV2', 'desc_lv': 'LV2_DESC', 'le': [{'date': '10.10.2013', 'name_le': 'LE', 'tag': [], 'abs': [], 'numb': 1}]}
{'name_lv': 'LV3', 'desc_lv': 'LV3_DESC', 'le': [{'date': '10.10.2013', 'name_le': 'LE', 'tag': [], 'abs': [], 'numb': 1}]}
Es sollte aber so aussehen:

Code: Alles auswählen

{'name_lv': 'LV1', 'desc_lv': 'LV1_DESC', 'le': []}
{'name_lv': 'LV2', 'desc_lv': 'LV2_DESC', 'le': [{'date': '10.10.2013', 'name_le': 'LE', 'tag': [], 'abs': [], 'numb': 1}]}
{'name_lv': 'LV3', 'desc_lv': 'LV3_DESC', 'le': []}
Ich steh grad voll auf dem Schlauch warum das so ist und was ich dagegen tun kann.

Vielen Dank für eure Hilfe

Re: Problem mit verschachtelten Datenstrukturen

Verfasst: Donnerstag 17. Januar 2013, 15:57
von BlackJack
@gangfish: Die `copy()`-Methode erzeugt eine flache Kopie, d.h. nur das Objekt auf dem sie aufgerufen wird, wird neu erstellt und dann die ganzen Elemente aus dem alten Objekt in das neue übertragen. Du suchst das `copy`-Modul und dort die Funktion `deepcopy()`.

Re: Problem mit verschachtelten Datenstrukturen

Verfasst: Donnerstag 17. Januar 2013, 15:59
von /me
deepcopy erstellt nicht nur eine Kopie der ersten Ebene.

Edit: Und wieder war BlackJack schneller

Re: Problem mit verschachtelten Datenstrukturen

Verfasst: Donnerstag 17. Januar 2013, 16:26
von gangfish
Besten Dank jetzt läuft die ganze geschichte :D