A quirk/gotcha of for i, x in enumerate(seq) when seq is empty
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Thu Feb 23 20:08:58 EST 2012
On Thu, 23 Feb 2012 16:30:09 -0800, Alex Willmer wrote:
> This week I was slightly surprised by a behaviour that I've not
> considered before. I've long used
>
> for i, x in enumerate(seq):
> # do stuff
>
> as a standard looping-with-index construct. In Python for loops don't
> create a scope, so the loop variables are available afterward. I've
> sometimes used this to print or return a record count e.g.
>
> for i, x in enumerate(seq):
> # do stuff
> print 'Processed %i records' % i+1
>
> However as I found out, if seq is empty then i and x are never created.
This has nothing to do with enumerate. It applies to for loops in
general: the loop variable is not initialised if the loop never runs.
What value should it take? Zero? Minus one? The empty string? None?
Whatever answer Python choose would be almost always wrong, so it refuses
to guess.
> The above code will raise NameError. So if a record count is needed, and
> the loop is not guaranteed to execute the following seems more correct:
>
> i = 0
> for x in seq:
> # do stuff
> i += 1
> print 'Processed %i records' % i
What fixes the problem is not avoiding enumerate, or performing the
increments in slow Python instead of fast C, but that you initialise the
loop variable you care about before the loop in case it doesn't run.
i = 0
for i,x in enumerate(seq):
# do stuff
is all you need: the addition of one extra line, to initialise the loop
variable i (and, if you need it, x) before hand.
--
Steven
More information about the Python-list
mailing list