(no subject)

Dec 18, 2007 01:04

Наши друзья с альтернативных блог-серверов интересуются, почему вот такой код:

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]).

tech, programming, python

Previous post Next post
Up