On 10/22/2016 11:24 PM, Chris Angelico wrote:
On Sun, Oct 23, 2016 at 2:14 PM, Steve D'Aprano
<steve+pyt...@pearwood.info> wrote:
But it seems that the first iterator (and only that one) is evaluated
in the parent context:

Because the first iterator *can* always be evaluated.

I don't understand what you mean by that. If I take you literally, it is
obviously not true:

py> [x for x in garglebarblewarble]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'garglebarblewarble' is not defined

but I'm sure you know that, so I don't understand what you mean by "always".

AIUI, what he means is this:

Right.  You put it better than I did.

1) Sometimes, all the iterables can be evaluated in advance.

dice_2d6 = [a+b for a in range(1,7) for b in range(1,7)]

2) But sometimes, subsequent iterables depend on the outer loop.

triangle = [a+b for a in range(1, 7) for b in range(1, a+1)]

So in case #2, you cannot evaluate the second range until you're
actually in the loop - but in both cases, the first one can be
pre-evaluated. Also, the most-outside loop's iterable gets evaluated
exactly once, whereas inner loops might be evaluated more often (or
less, for that matter).

Only in extreme edge cases involving name scoping can the evaluation
of the first iterable depend on whether it's inside or outside the
invisible function.

ChrisA



--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to