Проблема возникает из выражения lambda
, поскольку она решается во время вызова.Эта функция приводит к различным проблемам, когда вы создаете группу lambda
s внутри for loop
.В своем коде вы используете lambda
внутри lambda
внутри for loop
, а затем возвращаете получившийся вложенный lambda
, чтобы вызвать его позже.
Вы можете решить проблему следующим образом:
def fnLong(fnList):
currF = lambda m: m
for f in fnList:
currF = lambda m, f=f, currF=currF: f(currF(m))
return currF
currF=currF
и f=f
добавлены для указания аргументов (связывания аргументов) для каждого lambda
выражений внутри for loop
во время создания этого самого lambda
.Это решение работает, потому что значения аргументов по умолчанию создаются при создании (определении) функции, а не при вызове функции.currF=currF
позволяет избежать рекурсии, f=f
позволяет избежать использования только последней функции в fnList
.
На мой взгляд, трудно сказать, является ли эта версия более читабельной, чем оригинальная.