You know the answer: yes. ;) Take comfort, however, as this is a very common discovery for budding pythonistas. When you define a function or lambda that references variables not "created" inside that function, it creates a closure over the variables. The effect is that you get the value of the variable when calling the function, not the value at definition time. (You were expecting the latter.)
There are a few ways to deal with this. First is binding extra variables:
funcs = []
for x in range(10):
funcs.append(lambda x=x: x)
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
The second way is a little more formal:
from functools import partial
funcs = []
for x in range(10):
funcs.append(partial(lambda x: x, x))
print [f() for f in funcs]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]