2017-01-30 5 views
2

Почему в PythonВнешняя переменная Объем в лямбда-функции

[f() for f in [lambda: d for d in [1,2]]] 

дает

[2, 2] 

Почему результат отличается от других языков (где результат [1,2], как ожидалось)? Есть некоторые разумные причины такого неочевидного поведения?

+0

Сфера параметров может быть? Требуется закрытие для сохранения предыдущих значений. Возможно дублирование [Область действия лямбда-функций python и их параметры] (http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) – Dilettant

ответ

2

В этом [lambda d: for d in [1,2]] что у вас есть

«Запуск d от 1 до 2, дают мне функцию, возвращающую значение d в тот момент, когда функция вызывается.»

После этого список из двух функций построен, вы вызываете [f() for f in that list]. На данный момент функция вызывается, d in [1,2] уже завершен, и d имеет свое окончательное значение, 2. Таким образом, обе функции возвращают 2.

Один из способов получить другой результат - скопировать d в переменную для каждой создаваемой лямбда-функции. Самый простой способ сделать это:

[f() for f in [lambda x=d: x for d in [1,2]]] 

Здесь каждый lambda имеет свое собственное значение по умолчанию для x, который d в то время, функция создается.

+0

Только через несколько секунд ;-) + 1 – Dilettant

+0

Да, спасибо. Мой главный вопрос: _why_ not_how_ он работает. Я знаю только, что причина может быть связана с таинственной фразой _lexical scope_ – kakabomba

+0

Когда вы создаете функцию лямбда, ссылающуюся на локальную переменную, она не делает копию этой переменной для функции лямбда; он ссылается на именованную переменную. В этом случае указанная переменная определенно имеет значение '2' в момент, когда вы вызываете ваши лямбда-функции. Или по-другому, ваши две лямбда-функции идентичны: они оба возвращают одну и ту же переменную 'd'. Так почему у них будет другое поведение? – khelwood

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