[Tutor] scratching my head - still

Steven D'Aprano steve at pearwood.info
Wed Aug 5 04:46:10 CEST 2015


On Tue, Aug 04, 2015 at 05:52:15PM -0700, Clayton Kirkwood wrote:
> As seen below (closely), some filenames are not being removed while others
> are, such as in the first stanza, some pdfs are removed, some aren't. In the
> second stanza, Thumbs.db makes it through, but was caught in the first
> stanza. (Thanks for those who have proffered solutions to date!)
> I see no logic in the results. What am I missing???

You are modifying the list of files while iterating over it, which plays 
all sorts of hell with the process. Watch this:

py> alist = [1, 2, 3, 4, 5, 6, 7, 8]
py> for n in alist:
...     if n%2 == 0:  # even number
...             alist.remove(n)
...     print(n)
...
1
2
4
6
8
py> print(alist)
[1, 3, 5, 7]



If you pretend to be the Python interpreter, and simulate the process 
yourself, you'll see the same thing. Imagine that there is a pointer to 
the current item in the list. First time through the loop, it points to 
the first item, and you print the value and move on:

[>1, 2, 3, 4, 5, 6, 7, 8]
print 1

The second time through the loop:

[1, >2, 3, 4, 5, 6, 7, 8]
remove the 2, leaves the pointer pointing at three: 
    [1, >3, 4, 5, 6, 7, 8]
print 2

Third time through the loop, we move on to the next value:

[1, 3, >4, 5, 6, 7, 8]
remove the 4, leaves the pointer pointing at five: 
    [1, 3, >5, 6, 7, 8]
print 4

and so on.

The lesson here is that you should never modify a list while iterating 
over it. Instead, make a copy, and modify the copy.



-- 
Steve


More information about the Tutor mailing list