Seite 1 von 1

Frage zu Dictionaries

Verfasst: Sonntag 11. November 2007, 14:38
von capsule5
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

Verfasst: Sonntag 11. November 2007, 14:47
von HWK
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

Verfasst: Sonntag 11. November 2007, 15:05
von capsule5
Danke, so gehts!! :D

Gruß
Christoph

Verfasst: Sonntag 11. November 2007, 15:16
von 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}