Вопрос по lambda, python, for-loop – Python лямбда не запоминает аргумент для цикла [duplicate]

4

Possible Duplicate:
Use value of variable in lambda expression

Я работаю с python и пытаюсь выделить проблему, которая была у меня с лямбда-функциями.

Из следующего кода я ожидал создать две лямбда-функции, каждая из которых получит разные x, и результат должен быть
1 2

but the output is 2 2

Зачем? И как я могу сделать две разные функции? Используя def?

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda : print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
Неправильное использование ламбы. Он просто возвращает значение поворота печати, которое равно None. Печать должна быть командой, а не выражением. jamylak

Ваш Ответ

3   ответа
3

Это исправит это. Это потому, что х напрямую связан с лямбда.

def create_lambda(x):
    return lambda : print(x)

def main():
    d = {}
    for x in [1,2]:
        d[x] = create_lambda(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
14

Телоlambda в вашем коде упоминается имяx, Значение, связанное с этим именем, изменяется на следующей итерации цикла, поэтому, когда вызывается лямбда, и он разрешает имя, он получает новое значение.

Чтобы достичь ожидаемого результата, свяжите значениеx в цикле к параметруlambda и затем обратитесь к этому параметру, как показано ниже:

def main():
    d = {}
    for x in [1,2]:
        d[x] = lambda x=x: print(x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()

>>> 
1
2
@drewk: Этот ответ применим к любому Python с момента появленияlambda.
Хотя код ответа не является неправильным, я предлагаю изменить связанную переменную в лямбде, чтобы назвать ее как-то иначе. Для улучшения ясности. Я предлагаю:d[x] = lambda y=x: print(y)   , (Я пытался редактировать пост, но редактирование менее 6 символов не допускается) user985366
@drewk хороший момент: разница в том, чтоprint это утверждение в Python & lt; 3, и поэтому не допускается вlambda, Это функция в Python 3, и поэтому она разрешена там.
Python 3k + только я думаю ... Не работает (для меня) в P2.7, но работает в P3.2 и P3.3
Если вы действительно беспокоитесь оprint в лямбде, просто используйтеsys.stdout.write(x+"\n")
4

Похоже, работа дляpartial.

from functools import partial 
def main():
    d = {}
    for x in [1,2]:
        d[x] = partial(lambda x: print(x), x=x)

    d[1]()
    d[2]()


if __name__ == '__main__':
    main()
+1. Простой способ сделать это - написать это какd[x] = lambda x=x: print(x), Тем не мение,partial позволяет заблокировать аргументы. Это может быть написано лучше какd[x] = partial(print, x), посколькуprint это функция. Не нужно оборачивать его в лямбду.
Ваш комментарий отличный! я написалlambdaСпроси вопрос оlambda :)

Похожие вопросы