Ответ в в этом посте подробно описывает, как внутренние функции python не используют значение переменных замыкания до тех пор, пока внутренняя функция не выполнится, найдя имя переменной в соответствующей области видимости.
Например:
funcs = [(lambda: x) for x in range(3)]
Вызов любого из сгенерированных лямбд возвращает 2:
>>> funcs[0]()
2
>>> funcs[1]()
2
>>> funcs[2]()
2
Есть ли способ заставить значение x быть определенным, когда функция определена, а не когда она выполняется позже? В приведенном выше примере мой желаемый вывод равен 0, 1, 2, соответственно.
Более конкретно, мой сценарий использования - предоставить пользователям API возможность удобно превращать пользовательскую функцию в поток с помощью декоратора. Например:
for idx in range(3):
@thread_this(name=f'thread_{idx}')
def custom():
do_something()
print(f'thread_{idx} complete.')
Когда выполняется последний оператор печати, он получает значение current , равное idx
, в глобальной области видимости. При наличии соответствующих операторов сна все 3 потока выведут 'thread_2 complete.'