Arhn - архитектура программирования

лямбда-функции и список функций в Python

У меня есть массив функций, например:

>>> def f():
...     print "f"
... 
>>> def g():
...     print "g"
... 
>>> c=[f,g]

Затем я пытаюсь создать две лямбда-функции:

>>> i=0
>>> x=lambda: c[i]()
>>> i+=1
>>> y=lambda: c[i]()

А затем позвоните им:

>>> x()
g
>>> y()
g

Почему c[i] в ​​лямбда одинаковые?

26.05.2013

  • простой способ решить эту проблему — просто не создавать бесполезные lambda. Просто замените эти две строки на x = c[i] и y = c[i], и вы получите именно те функции, которые хотели. Единственная причина когда-либо писать lambda: f() вместо f состоит в том, чтобы вставить f в пространство имен закрытия, чтобы найти его позже, вместо того, чтобы просто использовать его. Вы не хотите делать это здесь, и на самом деле это именно то, что вызывает вашу проблему. 27.05.2013

Ответы:


1

Это связано с тем, что лямбда-функция извлекает значение глобальной переменной i во время выполнения:

>>> i = 0
>>> x=lambda z = i : c[z]() #assign the current value of `i` to a local variable inside lambda
>>> i+=1
>>> y =lambda z = i : c[z]()
>>> x()
f
>>> y()
g

Обязательно прочтите: Что захватывают замыкания функций (лямбда)?

26.05.2013
  • Примечание: принятый ответ на связанный вопрос показывает, как добиться желаемого захвата имени (см. функцию createAdder в конце stackoverflow.com /a/2295368/25050. 27.05.2013

  • 2

    В Python замыкания захватывают не фактические значения, а пространства имен. Поэтому, когда вы используете i внутри своей функции, она фактически просматривается во внешней области видимости. И значение там уже изменилось.

    Вам не нужны все эти lambda и списки, чтобы увидеть это.

    >>> x = 1
    >>> def f():
    ...   print(x)
    ...
    >>> x = 2
    >>> def g():
    ...   print(x)
    ...
    >>> g()
    2
    >>> f()
    2
    
    26.05.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..