Frage zu Dictionaries

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
capsule5
User
Beiträge: 28
Registriert: Sonntag 10. Dezember 2006, 18:49

Hallo zusammen,

ich habe folgendes Problem:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

class One(dict):

    def __init__(self, id=0, name="", tel=0, member=[]):
        dict.__init__(self)
        self["id"] = id
        self["name"] = name
        self["tel"] = tel
        self["member"] = member


class Many(object):

    def __init__(self):
        self._m = {}

    def add(self, id):
        self._m[id["id"]] = id

    def __getitem__(self, id):
        return self._m.get(id)

    def __iter__(self):
        return self._m.itervalues()


many = Many()
many.add(One(id=1, name="Mueller", tel="0800"))
many.add(One(id=3, name="Maier", tel="0802"))
many.add(One(id=4, name="Schulze", tel="0901"))
many.add(One(id=5, name="Becker", tel="0905"))
many.add(One(id=7, name="Schuster", tel="0706"))

for one in many:
    print one # ok

print ""
print " add HSV to member von Becker"
many[5]["member"].append("HSV")
print many[5]["id"], many[5]["name"], many[5]["member"] #ok

print ""
for one in many:
    print one # warum "HSV" bei allen Elementen?
Warum taucht "HSV" in "member" bei allen Elementen von "many" auf?
Was mache ich falsch?

Gruß
Christoph
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Weil bei jedem Element member mit derselben leeren Liste initialisert wird.
Mach es z.B. so (ungetestet):

Code: Alles auswählen

def __init__(self, id=0, name="", tel=0, member=None):
    if member is None:
        member = []
MfG
HWK
capsule5
User
Beiträge: 28
Registriert: Sonntag 10. Dezember 2006, 18:49

Danke, so gehts!! :D

Gruß
Christoph
BlackJack

Noch ein paar Anmerkungen: Telefonnummern sind keine Zahlen also sollte man sie auch nicht mit 0 vorbelegen.

`id` ist der Name einer eingebauten Funktion, also als Name etwas ungünstig.

Die Klasse `One` ist etwas übertrieben falls da nicht noch nützliche Methoden hinzukommen. Wenn nicht genügt auch eine einfache Funktion, die ein Dictionary mit Werten befüllt:

Code: Alles auswählen

def create_one(id_=0, name='', tel='', member=None):
    if member is None:
        member = list()
    return {'id': id_, 'name': name, 'tel': tel, 'member': member}
Antworten