Наши
друзья с альтернативных блог-серверов интересуются, почему вот такой код:
fs = []
for x in [1, 2, 3]:
fs.append(lambda : x)
for f in fs:
print f(),
печатает 3 3 3 вместо 1 2 3.
Дело в том, что lambda сама по себе не создает замыкания, и при изменении x меняются и все функции в fs. Пофиксить это можно, например, с помощью функции, которая возвращает нужные анонимные функции:
def lgen(v):
return lambda : v
for x in [1, 2, 3]:
fs.append(lgen(x))
Не сомневаюсь, что про замыкания Олег знает не хуже меня (который аж два раза не смог рассказать про них на спецсеминаре ;)), но, если вдруг кому интересно, то у Фаулера есть
статья о том, что это вообще такое, а у Ивана Мура - перевод фаулеровских примеров на питон ([
1], [
2], [
3]).