2015-07-27 3 views
4
def multipliers(): 
    l = [] 
    for i in range(4): 
    l.append(lambda x : x * i) 
    return l 

>>> ll[0](2) 
6 
>>> ll[1](2) 
6 
>>> ll[2](2) 
6 
>>> ll[3](2) 
6 

Не могли бы вы объяснить здесь результат? Я надеялся получить:Создание лямбда-выражений на лету

0 
2 
4 
6 
+1

родственные: http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in -python (см. второй ответ о том, как справиться с вашей проблемой, и первый, чтобы объяснить, почему это происходит) – NightShadeQueen

+0

Хотя я не обвиняю вас в том, что вы не нашли этого: мне потребовалось четыре попытки с Google, несмотря на то, что я знал, что этот вопрос существует. – NightShadeQueen

+0

'site: stackoverflow.com python lambda' показывает несколько хороших результатов (в том числе и тот). – TigerhawkT3

ответ

2

Проблема в том, что , как говорят люди, i не является локальной переменной lambda. Вы должны исправить, что: использует значение параметра по умолчанию меняющегося во время цикла:

>>> def multipliers(): 
    l = [] 
    for i in range(4): 
    l.append(lambda x, i=i : x * i) 
    return l 

>>> lst = multipliers() 
>>> lst[0](2) 
0 
>>> lst[1](2) 
2 
>>> lst[2](2) 
4 
>>> lst[3](2) 
6 
>>> 
1

Значение i не хранится внутри функции lambda. Вот почему вы получаете результат, который видите: Python использует значение i, которое находит при вызове функции.

4

Причина этого в том, что затворы Python - это late binding. Это означает, что значения переменных, используемых в замыканиях, просматриваются во время вызова внутренней функции. Таким образом, когда вызываются какие-либо функции, возвращаемые multipliers(), значение i в это время просматривается в окружающем пространстве. К тому времени, независимо от того, какая из возвращаемых функций вызывается, цикл for завершен, и осталось i с его окончательным значением 3. Таким образом, каждый возвращается функция умножает значение, которое она передается по 3, поэтому, так как значение 2 передается в коде выше, все они возвращают значение 6

Взятые из: http://www.toptal.com/python/interview-questions

Смежные вопросы