Lambda is fine. The loops are mutating the variable i, so all the lambda share the same i. Apparently, list comprehensions also use mutation--I suppose that's fine.
i = 0
increment i
<do loop body with i>
It could have been: i = 0
increment 1
create new environment
bind i here
<do loop body>
In the second case, each loop body would have its own "i". In the first case, they all share the same "i".