Dictionary: Value als Variable?

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
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

Hi,

im Dict ist ja der Value vom Typ mutable und sollte auch eine Variable sein dürfen:

Code: Alles auswählen

wert_haus1=None
wert_haus2=None

werte_dict = {
  "Haus1": wert_haus1,
  "Haus2": wert_haus2
}

Das Dict ist global und dem Interpreter seit Anfang an bekannt. Der Inhalt von wert_haus1 zB wird aber erst später festgelegt. Starten tut das ganze mit den None-Typen.

Schreibe ich jedoch später die wert_haus1 Variablen, so enthält mein Dict immernoch den None-Typ. Es liegt hier also keine Speicheradresse als Value vor, oder wie kann man das verstehen?
Benutzeravatar
sparrow
User
Beiträge: 4188
Registriert: Freitag 17. April 2009, 10:28

Das vorgehen ist ein bisschen seltsam, weil du Variablen durchnummerierst und dann auch noch deren Werte an durchnummerierte Keys in einem dict bindest. Das wirkt so, als wäre die Art der Datenstruktur falsch.

Die Aussage "im Dict ist ja der Value vom Typ mutable" ist falsch.
Der Typ des Values hängt natürlich von dem ab, was der Value ist.

Code: Alles auswählen

ham = "Ham"
spam = ham  # der Wert von ham wird an spam gebunden
spam = "Spam"  # ein neues Stringliteral wird an den Namen spam gebunden
Selbstverständlich wird ham hier nicht verändert.
Genausowenig in einem dict.
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Fehler ist zu denken das dict speichert einen Bezug auf die Variable. Das stimmt nicht. Es speichert den Bezug auf das Objekt (None in deinem Beispiel), auf den auch die Variable sich bezieht. Nur weil du die Variable später auf etwas anders zeigen lässt, ändert das keine anderen Bezüge.
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

ja, ich müsste eigentlich eine Adresse in das Dict legen. Aber das geht dann wahrscheinlich nicht..
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das geht nicht. Was geht ist ein anderes Veraenderbares Objekt reinzulegen, und das zu veraendern. Aber das klingt alles nach einem sehr deutlichen "Code-Smell". Was fuer ein Problem soll hier geloest werden?
Benutzeravatar
__blackjack__
User
Beiträge: 13082
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

„Das Dict ist global […] Der Inhalt von wert_haus1 zB wird aber erst später festgelegt.“ klingt schon falsch weil das auf globale Variablen hinaus läuft. Was global auf Modulebene existiert sollte Konstant sein und sich später nicht mehr ändern, auch indirekt der Inhalt von solchen Datenstrukturen nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

ich lese eine ini Datei mit Benutzerwerten ein - die sollen dann Teil des Dicts sein. Dies passiert aber erst nachdem ich das Dict schon definiert habe.
Benutzeravatar
sparrow
User
Beiträge: 4188
Registriert: Freitag 17. April 2009, 10:28

Dann gehört das, wie __blackjack__ schon schreibt, nicht auf Modulebene und sollte nicht global sein.
Und ich sehe die Notwendigkeit auch nicht, die Daten an zwei verschiedene Namen zu binden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@HeinzBacker: das hört sich wieder falsch an. Die Werte der ini-Datei definieren das Wörterbuch; Strukturen mit Dummywerten zu erstellen, um sie später zu ersetzen macht man in Python nicht.
Antworten