an den Wert einer Variable kommen, wenn sie als String gegeben ist

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
spätpythonier
User
Beiträge: 5
Registriert: Freitag 8. Januar 2021, 18:38

>>>v=[1,2] ist eine globale Variable
>>>String="vwxyz"
>>>String[0]
v
Ich möchte aber [1,2] zurückbekommen, um zum Beispiel [1,2]+[3,4] bilden zu können.
Ich versuchte es mit eval(), habe es aber nicht hinbekommen.
In LOGO gibt es thing 'v, was den Wert der Variable mit dem Namen 'v, also [1,2] zurückgibt.
Gibt es in Python ein vergleichbares Konstrukt?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du so etwas machen willst, dann benutzt man in Python keine Variablen. Sondern Datenstrukturen, in diesem Fall ein Woerterbuch.

Code: Alles auswählen

variables = { "v": [1, 2]}
key = "v"
print(variables[key])
Benutzeravatar
sparrow
User
Beiträge: 4529
Registriert: Freitag 17. April 2009, 10:28

@spätpythonier: Und globale Variablen sind etwas, das man nicht benutzen sollte.
spätpythonier
User
Beiträge: 5
Registriert: Freitag 8. Januar 2021, 18:38

Wenn es, sagen wir mal, 30-40 solche globalen Variablen sind, und jede für eine Liste mit 30-80 Elementen steht.
Benutzeravatar
pillmuncher
User
Beiträge: 1529
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@spätpythonier: Auch dann nimmt man ein dict.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@spätpythonier: Und um noch mal sparrow zu zitieren: „Und globale Variablen sind etwas, das man nicht benutzen sollte.“

Warum müssen die global sein? Und warum 30—40? Das sind viel zu viele Variablen. Üblicherweise hat man so 5—7 Variablen in einer Funktion. *Lokal*. Weil das die ”Dinge” sind, die man durchschnittlich gleichzeitig im Kopf behalten kann.

Was willst Du denn *eigentlich* damit lösen? Also beschreibe mal das Problem in der Problemdomäne und nicht was Du denkst was die Lösung dafür ist.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
spätpythonier
User
Beiträge: 5
Registriert: Freitag 8. Januar 2021, 18:38

ok, mach' ich.
Benutzeravatar
kbr
User
Beiträge: 1504
Registriert: Mittwoch 15. Oktober 2008, 09:27

spätpythonier hat geschrieben: Samstag 9. Januar 2021, 16:16 Ich möchte aber [1,2] zurückbekommen, um zum Beispiel [1,2]+[3,4] bilden zu können.
Das geht schon

Code: Alles auswählen

>>> v = [1, 2]
>>> string = "vwxyz"
>>> globals()[string[0]]
[1, 2]
ist aber der geradlinige Weg in die Vorhölle der Seiteneffekte und womöglich Schlimmeres.

Nehmen wir an, Du hättest eine zweite Liste 'w' und möchtest 'v' auf obige Weise damit erweitern:

Code: Alles auswählen

>>> w = [3, 4]
>>> globals()[string[0]].extend(globals()[string[1]])
>>> globals()[string[0]]
[1, 2, 3, 4]
Nehmen wir weiter an, das Programm sei voll von solchen Konstrukten: im besten Fall blickt keiner mehr durch. Bei ähnlichen Codes habe ich leider schon die Empfehlungen geben müssen, diesen komplett neu zu schreiben, da dessen Funktionsweise nicht mehr nachvollziehbar und das Programm nicht mehr wartbar war. Also ein erheblicher Zeitverlust für die Betroffenen, der bei Firmen zudem mit den Personalkosten zu multiplizieren wäre.

Daher die Empfehlungen hier, Dictionaries zu verwenden sowie Variablen auf globaler Ebene zu vermeiden. Wenn Du irgendwo "global(s)" siehst, sei es als Keyword oder, wie oben, als Funktionsaufruf, dann gehe einen Schritt zurück, halte ein – und mache einen großen Bogen drum :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

🤦‍♂️ Ich schließe wetten darauf ab, welche Methode jetzt zum Einsatz kommt.

Man zieht Leuten, die gerade von der Brücke springen wollen, nicht die tiefste Stelle. Auch nicht mir dem Hinweis “hier aber bitte nicht springen”.
Benutzeravatar
kbr
User
Beiträge: 1504
Registriert: Mittwoch 15. Oktober 2008, 09:27

Da ist sicher was dran, Programmieren ist aber eine technische Disziplin und da halte ich es durchaus für sinnvoll, ähnlich wie bei einem Handwerk, nicht nur zu zeigen wie die Dinge funktionieren, sondern auch darauf hinzuweisen, was warum nicht funktioniert und deswegen unbedingt zu vermeiden ist.

Ich setze dabei durchaus auf Lernfähigkeit. Denn wenn diese nicht vorhanden ist, kann man sich jegliche Mühe sparen. Und wer jetzt noch global verwendet, dem ist nicht mehr zu helfen.

Deshalb hoffe ich im Sinne des OP, dass Du keine Wetten abschließen brauchst.
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Du hast hier aber nicht etwas gezeigt was nicht funktioniert sondern Du hast etwas gezeigt was ganz wunderbar funktioniert, aber eine sauschlechte Idee ist. Was ein Anfänger aber nicht merkt, sondern erst wenn er so viel davon Gebrauch macht, dass es viel Arbeit ist das alles wieder loszuwerden.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1504
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Natürlich funktioniert es, aber nicht "wunderbar". Und Anfänger, die bereit sind auch den Text um den Code zu lesen, finden dort auch eine Antwort auf Deine Anmerkung.
Antworten