Seite 1 von 1
Anfänger frage zu for x in -Schleifen
Verfasst: Montag 9. Mai 2011, 11:11
von ravenheart
Hallo, darf ich so etwas machen?
Code: Alles auswählen
x = liste
for element in liste:
element = foo(element)
print irgendwas
Dürfen ist vlt falsch ausgedrückt, vielmehr will ich wissen, ob so etwas Einfluss auf meine Iteration hat, oder ich so ein element bearbeiten kann
Re: Anfänger frage zu for x in -Schleifen
Verfasst: Montag 9. Mai 2011, 11:23
von Xynon1
Wieso sollte das einen Einfluß auf die Iteration haben? Du iterierst doch über "liste" und nicht über "element". Was du mit dem "element" machst ist der Liste ziemlich egal.
Re: Anfänger frage zu for x in -Schleifen
Verfasst: Montag 9. Mai 2011, 11:38
von Rekrul
Das 'darfst' du natürlich schon machen. Es ist allerdings je nach dem was du erwartest sinnvoll oder eben nicht sinnvoll. In folgendem Beispiel verändert du die Liste nicht, da es sich um skalare Werte handelt.
Code: Alles auswählen
x = [1,2,3]
def increment(value):
return value + 1
for e in x:
e = increment(e)
print(e)
print(x)
Die Ausgabe wäre hier folgende:
Hast du allerdings eine List mit Referenzen passiert folgendes:
Code: Alles auswählen
class A(object):
def __init__(self, x):
self.x = x
def __add__(self, y):
return self.x + y
def __str__(self):
return str(self.x)
def __repr__(self):
#Eigentlich ganz boese!
return str(self.x)
x = [A(1), A(2), A(3)]
def increment(value):
return value + 1
for e in x:
e = increment(e)
print(e)
print(x)
Ausgabe:
Re: Anfänger frage zu for x in -Schleifen
Verfasst: Dienstag 10. Mai 2011, 12:45
von mkesper
Du darfst nur nicht am Inhalt von "liste" herumpfuschen. Wenn sich da im Schleifenablauf etwas verändern soll müsstest du vorher eine Kopie der Liste ziehen. Ansonsten "kotzt" der Interpreter.

Re: Anfänger frage zu for x in -Schleifen
Verfasst: Dienstag 10. Mai 2011, 12:59
von BlackJack
@mkesper: Das ist so allgemein gesagt nicht richtig. Man muss sich bei Änderungen nur über die Auswirkungen im Klaren sein.
Re: Anfänger frage zu for x in -Schleifen
Verfasst: Dienstag 10. Mai 2011, 13:24
von mutetella
Dass folgendes in die Hosen geht, ist klar:
Code: Alles auswählen
my_list = [1, 2, 3]
for e in my_list:
print e
my_list.append(e)
Aber weshalb geschieht dasselbe nicht auch hier:
Code: Alles auswählen
my_string = 'hallo'
for e in my_string:
print e
my_string += e.upper()
Das heißt, es passiert hier nur beim ersten Durchlauf über 'my_string'. Weshalb?
mutetella
Re: Anfänger frage zu for x in -Schleifen
Verfasst: Dienstag 10. Mai 2011, 13:40
von Hyperion
Weil strings in Python immutable sind! Dein Name `my_string` im Schleifenrumpf ist ein vollkommen neues Objekt. (Übrigens wird bei jedem Durchlauf ein neues Objekt angelegt... ein Grund, wieso man String-Konkatinierung mittels "+" meiden sollte).
Kannst Dir ja mal die `id()` ausgeben lassen, da sollte es zeigen.
Edit: Nee, zeigt es nicht. Augenscheinlich ist der Interpreter schlau und weist dem neuen Objekt immer wieder den selben Speicherbereich zu.
Aber so kann man es sich ja auch klar machen:
Code: Alles auswählen
In [24]: my_string = 'hallo'
In [25]: foo = my_string
In [26]: foo is my_string
Out[26]: True
In [28]: for e in my_string:
print e
my_string += e.upper()
print id(my_string), id(foo)
print my_string is foo
....:
....:
h
153407904 153533600
False
a
153407904 153533600
False
l
153407904 153533600
False
l
153407904 153533600
False
o
153407904 153533600
False