It is not safe to modify the sequence being iterated over in the loop (this can only happen for mutable sequence types, such as lists). If you need to modify the list you are iterating over (for example, to duplicate selected items) you must iterate over a copy. The slice notation makes this particularly convenient:
>>> for x in a[:]: # make a slice copy of the entire list ... if len(x) > 6: a.insert(0, x) ... >>> a ['defenestrate', 'cat', 'window', 'defenestrate']
why is it not safe to just do for x in a ??
Without getting too technical:
If you’re iterating through a mutable sequence in Python and the sequence is changed while it’s being iterated through, it is not always entirely clear what will happen. If you insert an element in the sequence while iterating through it, what would now reasonably be considered the “next” element in the sequence? What if you delete the next object?
For this reason, iterating through a mutable sequence while you’re changing it leads to unspecified behaviour. Anything might happen, depending on exactly how the list is implemented. 🙂