Problem mit verschachtelten Datenstrukturen

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
gangfish
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2013, 15:22

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
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()`.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

deepcopy erstellt nicht nur eine Kopie der ersten Ebene.

Edit: Und wieder war BlackJack schneller
gangfish
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2013, 15:22

Besten Dank jetzt läuft die ganze geschichte :D
Antworten