for statement

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

for statement

Beitragvon student » Freitag 9. Juli 2004, 15:11

hi, lese gerade die Doku(bin noch newb)
Frage zur folgenden Schleife:

Code: Alles auswählen

a=['cat', 'window', 'defenestrate']
for x in a[:]:
       if len(x) > 6: a.insert(0, x)


warum kann ich hier nicht einfach nur
for x in a:
.....
schreiben??
warum dieses [:] hinter a?

viele grüße
student
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 9. Juli 2004, 15:33

Hi. Lass dir danach mal a ausgeben, dann wirst du sehen, dass a erweitert wurde. Mit a[:] wird nur über eine Kopie von a iteriert, die sich nicht verändert. Damit soll wohl in der Docu zum Ausdruck gebracht werden, dass man Sequenz, über die man gerade iteriert besser nicht verändern sollte, in diesem Fall würde das zu einer Endlosschleife führen. Du musst nämlich wissen, dass Listen und Dictionary vom Typ mutable sind, also veränderbar. Wenn ich nun a mit den Methoden verändere, wird während der Iteration die Liste verlängert und immer wieder ein Stein dazugesetzt, sodas i scheinbar gar nicht vom Fleck kommt. Mit der Kopie wird das verhindert. Solch eine Anwendung ist aber wohl eher selten.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 9. Juli 2004, 16:50

Hi,

um das im Source noch deutlicher zu machen würde ich das dann so lösen:

Code: Alles auswählen

a=['cat', 'window', 'defenestrate']
for x in tuple(a):
       if len(x) > 6: a.insert(0, x)


jetzt wird aus der Liste a ein Tuple erzeugt über welches dann iteriert wird. Tuples sind imutable, also unveränderlich.


Gruß

Dookie

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]