Iteration eines Variablenindex in Schleife

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
Frederik
User
Beiträge: 11
Registriert: Dienstag 28. April 2009, 00:37

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
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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...
http://www.kinderpornos.info
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn man das überhaupt macht dann doch wenigstens mit locals().

Man könnte aber auch einfach einen Generator zurückgeben.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Mag denn niemand mehr exec? :D

Code: Alles auswählen

>>> for i in range(10):
	exec "var_%s = %s" % (i, i)

>>> var_6
6
BlackJack

@Dill: Da `None` ein "immutable" ist:

Code: Alles auswählen

var = [None] * 5
# ...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

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