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:

Code: Alles auswählen

2
3
4
[1,2,3]
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:

Code: Alles auswählen

2
3
4
[2,3,4]

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