One of my friends asked me about this piece of code:
array = [1, 8, 15]
gen = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]
print(list(gen))
The output:
[8]
Where did the other elements go?
The answer is in the PEP of the generator expressions, in particular the session Early Binding vs Late biding:
After much discussion, it was decided that the first (outermost) for-expression should be evaluated immediately and that the remaining expressions be evaluated when the generator is executed.
So basically the array
in:
x for x in array
is evaluated using the original list [1, 8, 15]
(i.e. immediately), while the other one:
if array.count(x) > 0
is evaluated when the generator is executed using:
print(list(gen))
at which point array
refers to a new list [2, 8, 22]