Создавать динамические функции, сохраняя состояние
Python начинающий вопрос. Скажем, вы хотите динамически создать функцию, которая поддерживает некоторое состояние (в коде ниже целое число i). Тогда, поскольку определенная функция является объектом, мы могли бы использовать его позже. В следующем коде я добавляю функции в список, и каждый вызов print(fn(0))
должно привести к 0 1 2 3 4
, но вместо этого я получаю 4 4 4 4 4
как будто только последнее значение i
используется.
fns = []
for i in range(5):
def fn(x):
return x + i
fns += [fn]
print(fns)
for fn in fns:
print(fn(0))
quit()
Можно ли выполнить в Python то, что пытается сделать этот код?
2 ответа
Решение
Чтобы обойти проблему позднего связывания, вы можете использовать параметр ключевого слова по умолчанию:
for i in range(5):
def fn(x, i=i): # <-----
return x + i
....
Функция, которая сохраняет свое собственное состояние? Я бы сделал это так:
class func:
# can behave as a function, but can also hold its own value
def __init__(self, value=0):
self.value = value
# this function is the actual 'function' that is called each time
def __call__(self, arg):
self.value += arg
return self.value
fns = []
for i in range(5):
# create new function, and give it a starting value of i
fn = func(i)
fns += [fn]
for fn in fns:
print( fn(0) )
Результат 0 1 2 3 4