Я получаю с ума такого рода проблемы:итерационный определение функций в Python
У меня есть список строки, представляющие функции (Eval), мне нужно сначала заменить переменные с общим x[0], x[1],...
.
Некоторое время назад я обнаружил, что могу сделать это, используя subs()
. Затем мне нужно сгенерировать список функций (чтобы определить ограничения в минимизации SciPy). Я пытаюсь что-то вроде:
el=[budget.v.values()[0],silly.v.values()[0]] # my list of string/equations
fl=[]
for i in range(len(el)):
def sos(v):
vdict = dict(zip(q.v.values(),v))
return eval(el[i]).subs(vdict)
fl.append(sos)
del sos # this may be unnecessary
Результат для фл является:
[<function sos at 0x19a26aa28>, <function sos at 0x199e3f398>]
но две функции всегда один и тот же результат (что соответствует определению Страшного «SOS»). Как сохранить различные определения функций?
_ "но две функции всегда дают одинаковый результат (соответствующий последнему определению sos)" _, потому что 'i' записывается по имени и поэтому, когда' sos() 'вызывается' i' будет иметь окончательное значение. См. [Здесь] (http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures) – FujiApple