Важно понимать, что когда переменная становится частью замыкания, это сама переменная, а не включаемое значение.
Это означает, что все замыкания, созданные в цикле, используют одну и ту же переменную f
, которая в конце цикла будет содержать последнее значение, использованное внутри цикла.
Из-за того, как определен язык, эти захваченные переменные «только для чтения» в Python 2.x: любое присваивание делает переменную локальной, если только она не объявлена global
(Python 3.x добавляет ключевое слово nonlocal
в разрешить запись в локальную область видимости).
Как сказал Йохен Ритцель в своем ответе, общая идиома, позволяющая избежать захвата этой переменной и получить вместо нее захват значения, заключается в записи
lambda f=f: os.startfile(f)
это работает, потому что значения параметров по умолчанию оцениваются во время создания функции, а f
это не внешняя переменная, а параметр функции, который будет иметь значение, которое вы хотите по умолчанию (так что эта лямбда-функция является просто функцией со значениями по умолчанию для параметры, больше не закрывая лексическую переменную).