Причина этого в том, что затворы Python - это late binding. Это означает, что значения переменных, используемых в замыканиях, просматриваются во время вызова внутренней функции. Таким образом, когда вызываются какие-либо функции, возвращаемые multipliers()
, значение i
в это время просматривается в окружающем пространстве. К тому времени, независимо от того, какая из возвращаемых функций вызывается, цикл for завершен, и осталось i
с его окончательным значением 3
. Таким образом, каждый возвращается функция умножает значение, которое она передается по 3
, поэтому, так как значение 2
передается в коде выше, все они возвращают значение 6
Взятые из: http://www.toptal.com/python/interview-questions
родственные: http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in -python (см. второй ответ о том, как справиться с вашей проблемой, и первый, чтобы объяснить, почему это происходит) – NightShadeQueen
Хотя я не обвиняю вас в том, что вы не нашли этого: мне потребовалось четыре попытки с Google, несмотря на то, что я знал, что этот вопрос существует. – NightShadeQueen
'site: stackoverflow.com python lambda' показывает несколько хороших результатов (в том числе и тот). – TigerhawkT3