лямбда-функция не закрывает параметр в Python?

Код говорит больше:

from pprint import pprint li = [] for i in range(5): li.append(lambda : pprint(i)) for k in li: k() 

Уступать:

  • Поиск среднего списка
  • Проблемы с лямбдой Python
  • Что такое «привязка lambda» в Python?
  • Использование Lambda и кортежей для отправки нескольким функциям: Python, Tkinter
  • Отложенная оценка с помощью лямбда в Python
  • Pandon pandas - фильтровать строки после groupby
  •  4
     4
     4
     4
     4
    

    почему нет

     0
     1
     2
     3
     4
    

    ??

    Благодарю.

    PS Если я напишу полный декоратор, он работает так, как ожидалось:

     from pprint import pprint li = [] #for i in range(5): #li.append(lambda : pprint(i)) def closure(i): def _func(): pprint(i) return _func for i in range(5): li.append(closure(i)) for k in li: k() 

  • Недопустимый заголовок http_host
  • Солевой стек: использование исполняемых модулей в SLS
  • Цикл tkinter и последовательная запись
  • Результаты классификации зависят от random_state?
  • Что является лучшим менеджером геометрии Tkinter, чем .grid ()
  • Что такое sys.maxint в Python 3?
  • 5 Solutions collect form web for “лямбда-функция не закрывает параметр в Python?”

    вам нужно сделать:

     lambda i=i: pprint(i) 

    вместо этого, чтобы зафиксировать текущее значение i

    Он правильно ссылается на i , только вещь состоит в том, что к тому времени, когда ваш список будет заполнен, i бы присвоил значение последнему элементу в последовательности, когда итерация закончилась, поэтому вы видите 4 целиком.

    Если вы не хотите использовать аргумент по умолчанию, который может вводить ошибки, если случайно вызван с аргументом, вы можете использовать вложенный лямбда:

     from pprint import pprint li = [] for i in range(5): li.append((lambda x: lambda: pprint(x))(i)) for k in li: k() 

    Это анонимная версия вашей функции closure .

    Лямбда-функции создают замыкания по переменной i . После завершения первого цикла цикла i имеет значение 4 .

    Затем начинается второй цикл цикла и выполняются все лямбда-функции. Затем каждый из них печатает текущее значение i , которое равно 4 .

    Ответ: Поскольку код внутри лямбда использует вашу глобальную переменную i .

    Ваш второй вариант будет делать то же самое, что и первый с лямбдой, если вы удалите параметр i :

     def closure(): 

    Вместо

     def closure(i): 

    Т.е. код внутри функции будет использовать глобальную переменную i .

    Python - лучший язык программирования в мире.