Вы знаете ответ: да. ;) Утешите, однако, так как это очень распространенное открытие для начинающих питонистов. Когда вы определяете функцию или лямбду, которая ссылается на переменные, не «созданные» внутри этой функции, она создает замыкание по переменным. В результате вы получаете значение переменной при вызове функции, а не значение во время определения. (Вы ожидали последнего.)
Есть несколько способов справиться с этим. Во-первых, это привязка дополнительных переменных:
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]
Второй способ немного более формален:
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]