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.ä. :-D

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...

:wink:
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.

:wink:
yipyip

Verfasst: Dienstag 28. April 2009, 18:11
von HerrHagen
Mag denn niemand mehr exec? :D

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:

Code: Alles auswählen

var = [None] * 5
# ...

Verfasst: Mittwoch 29. April 2009, 13:43
von HWK

Code: Alles auswählen

var = [...was auch immer... for i in xrange(5)] 
MfG
HWK