LINUX.ORG.RU

w0,w1 = (lambda x,k2=k: x+k2 for k in [-1,+1]); print(w0(0),w1(0))

иначе лябмда ничего не захватывает

anonymous
()
add = lambda x: lambda y: x + y
[add(k) for k in [-1, +1]]
vvn_black ★★★★★
()

функциональный паразит

anonymous
()

Это не list comprehension, это generator expression. Почему так работает? Видимо, генерируемые лямбды захватывают как лексический скоуп неймспейс генератора, но не его «слепок» в момент создания, а вообще, а в нем счетчик цикла по завершении итерирования имеет значение последнего элемента обходимого итератора, в данном случае 1. Анонимус правильный костыль подсказал для явного захвата.

Virtuos86 ★★★★★
()

k находится во внешем скопе лямбд и считывается при их вызове, т.е. когда генератор уже присвоил k=1. Лечится кёррингом, благодаря тому, что дефолтные значения аргументов пишутся при создании лямбд, а не при вызове.

float
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.