It sorta comes down to the fact that you can do something like this: (let ((x 0)) (defun incx (i) (incf x i)) (defun decx (i) (decf x i)) x isn’t a global variable- it’s local to those functions- but it’s also shared between them. That means that x was allocated once and stored somewhere both functions can see. When you use a loop variable in a future the same thing might happen- that loop variable gets stored somewhere shared, and as you modify the variable over the course of the loop and each future sees the shared one which is changing under their feet (instead of whatever what stored in the variable at the time the future was created).