Re: [Python-de] Liste mit Variablen: Ist das möglich ?

Gerhard Häring gh at ghaering.de
Don Dez 11 14:32:40 CET 2003


Michael Grabietz wrote:
> Hallo zusammen,
> 
> ich stehe vor folgender Situation:
> 
> Eine Liste my_list sollte verschiedene Variablen enthalten:
> (nicht deren Inhalte!) [...]

Ok. Im Channel #python auf FreeNode pflegen wir bei so was zu fragen: "what are 
you *really* trying to do?". Also, was willst du wirklich machen? Wozu das Ganze?

Denn in Python ist so gut wie alles theoretisch möglich, nur sinnvoll ist es 
deshalb noch lange nicht. Es gibt meistens bessere Möglichkeiten, das Problem zu 
lösen.

Also: was ist das Problem, das du so lösen willst?


> -----------------------------------------------------------
> 
> var1 = None
> 
> my_list = [ var1, var2, var3 ]  z.B. Attribute einer Klasse
> 
> Leider weise ich somit der Liste my_list die Werte von var1, var2, var3 
> zu und die sind None.
> 
> Kann ich überhaupt die Variablen in einer Liste halten ?

In Python gibt es Namen und Objekte (Objekte haben einen Typ, z. B. int, str, 
float, ...). Du kannst die Objekte direkt in einer Liste halten, oder deren Namen 
als String. Nur (s. o.), warum wolltest du den Namen in einer Liste halten?

> Ich habe eine weitere Liste mit Werten:
> ---------------------------------------
> val_list = [ val1, val2 ]       z.B. Strings
> 
> 
> Das will ich haben:
> -------------------
> 
> Da ich nur zwei Werte habe, sollen nur die ersten beiden Objekte in 
> my_list mit diesen Werten besetzt werden.
> 
> Also so:
> 
> var1 soll den Wert val1 zugewiesen bekommen
> var2 soll den Wert val2 zugewiesen bekommen
> var3 soll auf 'None' bleiben.

Es gibt in Python keine Pointer, also kannst du keine "Variablen in Listen 
stecken". Sobald du einen Namen dereferenzierst, bekommst du das Objekt, das an 
den Namen gebunden ist. Du kannst allerdings immer einen Namen auf ein neues 
Objekt binden.

Man in Python beliebig viel Blödsinn machen, z. B.

class Person:
     def __init__(self):
         vorname, nachname = None, None

     def hello(self):
         print "Ich bin %(vorname)s %(nachname)s" % self.__dict__

p = Person()
namen = ["vorname", "nachname"]
werte = ["Hans", "Mustermann"]

for name, wert in zip(namen, werte):
     setattr(p, name, wert)

p.hello()

Nur ist so was weder sinnvoll noch gut lesbar. setattr() ist hier die 
Schlüsselfunktion. Sie setzt bei einem Objekt die Attribute über den Namen des 
Attributs.

-- Gerhard