Проблема не в том, что func перезаписывается, а в том, что значение i
вычисляется при вызове функции, а не при ее определении. Если вы хотите оценить i
во время определения, поместите его в объявление функции в качестве аргумента по умолчанию func
.
funcs = []
for i in range(10):
def func(value=i):
print value
funcs.append(func)
for f in funcs:
f()
Аргументы по умолчанию оцениваются один раз, когда функция определена, поэтому инкрементный цикл не повлияет на них. Это сработало бы так же хорошо, если бы вы использовали
def func(i=i):
print i
но я использовал имя value
, чтобы было понятно, какое имя используется в функции.