Seite 1 von 1

Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 16:32
von Gremlin
Hallo,

hätte da mal eine Verständnisfrage zu Listen und Dictionaries.
Was passiert bei folgendem Beispiel im Hintergrund mit "new_dict" wenn die Funktion zu Ende ist?
Wird "DATA" weiterhin permanent auf "{1: 'a', 2: 'b', 3: 'c'}" verweisen, oder wird das irgendwann gelöscht?

Code: Alles auswählen

DATA = None

def get_something():
    return {1: 'a', 2: 'b', 3: 'c'}

def do_something():
    global DATA
    new_dict = get_something()
    DATA = new_dict

do_something()

Re: Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 16:35
von Dav1d
Globale variabeln sind nicht wirklich schön...

new_dict wird es nicht mehr "geben", new_dict ist nur in der Funktion bekann und eine lokale "Variable". Ich würde den Code so schreiben:

Code: Alles auswählen

def get_something():
    return {1: 'a', 2: 'b', 3: 'c'}

def do_something():
    new_dict = get_something()
    # do something with new_dict
    return new_dict

data = do_something()

Re: Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 16:52
von cofi
Gremlin hat geschrieben:Wird "DATA" weiterhin permanent auf "{1: 'a', 2: 'b', 3: 'c'}" verweisen, oder wird das irgendwann gelöscht?
Solange der Name `DATA` existiert, kann das zugrundeliegende Objekt nicht geloescht werden (wenn doch ist es ein Bug).
Warum denkst du, dass es anders laufen sollte? Nur weil in `a = b = list()` das Ergebnis zuerst an `b` gebunden wird, ist `b` nicht priviligierter als `a`: Das sind alles nur Namen.

Re: Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 17:32
von Gremlin
@Dav1d
Dass ich keinen Zugriff mehr auf "new_dict" hätte weiß ich, ich wollte auf das hinaus was cofi geschrieben hat. Aber danke für die Alternative ;)

@cofi
Danke, genau das wars. Wie ich darauf komme? Kam mir halt vorhin so in den Sinn als ich eben jenes Konstrukt im Begriff war zu erstellen. Und bevor ich irgendwas vermute frag ich dann doch mal lieber nach :roll:

Re: Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 23:26
von b.esser-wisser
cofi hat geschrieben:Nur weil in `a = b = list()` das Ergebnis zuerst an `b` gebunden wird, ist `b` nicht priviligierter als `a`: Das sind alles nur Namen.
Das stimmt doch so nicht, oder?
"d = d[0] = [42]" wäre doch da ein Gegenbeispiel? ( und bei "d[0] = d = [42]" wird d zu [42])

/klugscheiß,
Jörg

ps.: habe ich aber auch erst vor kurzem auf comp.lang.python gesehen.

Re: Kleine Frage zu variablen Objekten

Verfasst: Montag 18. Oktober 2010, 23:48
von BlackJack
@b.esser-wisser: Das `a` und `b` nur Namen sind stimmt schon. Du verwendest ja nicht einfach nur Zuweisungen an Namen sondern *veränderst* Objekte, denn da werden ja Methoden auf den Objekten aufgerufen -- `__setitem__()` nämlich. Bei Seiteneffekten kann die Reihenfolge natürlich eine Rolle spielen.

Re: Kleine Frage zu variablen Objekten

Verfasst: Dienstag 19. Oktober 2010, 14:50
von b.esser-wisser
@BlackJack:
Du hast recht, ich hätte das Zitat da etwas beschneiden sollen - ich wollte nur sagen, dass die Reihenfoleg anders ist.