Seite 1 von 1
Iteration eines Variablenindex in Schleife
Verfasst: Dienstag 28. April 2009, 00:47
von Frederik
Hallo,
kurze Frage: warum funktioniert folgender Code nicht und wie kann ich ihn schnell und einfach umgehen?
Code: Alles auswählen
def function():
for i in range(5):
var_i = ...
return var_1, var_2, ..., var_4
Viele Gruesse und vielen Dank,
Frederik
Verfasst: Dienstag 28. April 2009, 05:26
von BlackJack
@Frederik: Der funktioniert nicht, weil es die Namen `var_1`, `var_2`, `var_3`, und `var_4` nicht gibt, weil da nur der Name `var_i` an etwas gebunden wird.
"Umgehen" kannst Du das, in dem Du nicht versuchst durchnummerierte Namen dynamisch zu erzeugen sondern eine Liste verwendest.
Verfasst: Dienstag 28. April 2009, 06:48
von Leonidas
Würdest du etwa in dem Code auch erwarten, dass der Name expandiert wird?
Code: Alles auswählen
def function():
for i in range(5):
variable = ...
return var1able, var2able, ..., var4able
Das wäre doch ziemlich komisch, oder?
Verfasst: Dienstag 28. April 2009, 07:23
von Hyperion
Leonidas hat geschrieben:
Code: Alles auswählen
def function():
for i in range(5):
variable = ...
return var1able, var2able, ..., var4able
Aber eine geniale Idee für eine esotherische Programmiersprache - dynamische Namen statt Listen o.ä.
Verfasst: Dienstag 28. April 2009, 12:30
von Dill
es wäre natürlich absoluter schwachsinn, aber das geht doch bestimmt irgendwie... (die variablen dyn zu erzeugen).
was du willst:
Code: Alles auswählen
var = []
for i in range(5):
var.append(...was auch immer...)
und nicht etwa:
Code: Alles auswählen
var = []
for i in range(5):
var[i] = ...was auch immer... #error: den index gibt es nicht!
da hab ich auch noch ne frage, wie würde man das denn am elegantestens machen? so ...?
Code: Alles auswählen
var = [None for i in range(0, 5)]
for i in range(5):
var[i] = ...was auch immer...
Verfasst: Dienstag 28. April 2009, 12:36
von yipyip
Natürlich geht so etwas:
Code: Alles auswählen
def function():
for i in xrange(3):
globals().update({'var_%s' % i: i})
return var_0, var_1, var_2
print function()
Aber (normalerweise) macht man das nicht...
yipyip
Verfasst: Dienstag 28. April 2009, 14:09
von DasIch
Wenn man das überhaupt macht dann doch wenigstens mit locals().
Man könnte aber auch einfach einen Generator zurückgeben.
Verfasst: Dienstag 28. April 2009, 14:38
von yipyip
An locals() hatte ich erst auch gedacht,
aber
Code: Alles auswählen
def function():
print locals()
for i in xrange(3):
locals().update({'var_%s' % i: i})
print locals()
return var_0, var_1, var_2
print function()
ergibt
{}
{'i': 2, 'var_2': 2, 'var_1': 1, 'var_0': 0}
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "<stdin>", line 8, in function
NameError: global name 'var_0' is not defined
In der 2.6 Doku steht Entsprechendes:
locals()
Update and return a dictionary representing the current local symbol table.
Warning
The contents of this dictionary should not be modified; changes may not affect the values of local variables used by the interpreter.
yipyip
Verfasst: Dienstag 28. April 2009, 18:11
von HerrHagen
Mag denn niemand mehr exec?
Code: Alles auswählen
>>> for i in range(10):
exec "var_%s = %s" % (i, i)
>>> var_6
6
Verfasst: Dienstag 28. April 2009, 21:15
von BlackJack
@Dill: Da `None` ein "immutable" ist:
Verfasst: Mittwoch 29. April 2009, 13:43
von HWK