Kleine Frage zu variablen Objekten

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

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()
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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()
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

@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:
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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.
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.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@BlackJack:
Du hast recht, ich hätte das Zitat da etwas beschneiden sollen - ich wollte nur sagen, dass die Reihenfoleg anders ist.
Antworten