@wusa: Also von der Formulierung her hast Du es falsch verstanden. Es wird eine Kopie angelegt, aber die Werte werden nicht in die Kopie eingefügt. Dann wären sie danach ja auch gar nicht sichtbar, weil die Kopie an keinen Namen gebunden wird. `word` ist ja an die ursprüngliche Liste gebunden, nicht an die Kopie.
Das man mit `list(iterable)` eine neue Liste mit allen Elementen aus `iterable` erstellt mag vielleicht ganz am Anfang nicht offensichtlich sein, das braucht man aber und es ist flexibler als der `copy()`-Aufruf. Diese Methode muss nicht jede Sequenz haben. Der `list`-Typ hat die Methode auch erst relativ spät in der Python-Geschichte bekommen.
Und es findet in jedem Fall, auch in dem nicht funktionierenden, nur ein Durchlauf über die Liste statt. Nur das der da halt nie fertig wird, weil während des Durchlaufs die Liste kontinuierlich länger wird.
Noch eine Variante, die eine neue Liste für das Ergebnis anlegt, was in Python üblich ist(!):
Und die wohl flexibelste Variante die vom Argument nur erwartet, das es iterierbar ist, und auch nicht sofort eine komplette Liste erstellt, sondern die Elemente ”lazy” erzeugt:
Code: Alles auswählen
from itertools import chain, tee
def i_cannot_think_of_a_good_name_here(iterable):
items_a, items_b = tee(iterable)
return chain(filter(lambda s: len(s) > 6, items_a), items_b)
# ...
words = list(i_cannot_think_of_a_good_name_here(words))