Создание функций в цикле

Я пытаюсь создать функции внутри цикла и хранить их в словаре. Проблема в том, что все записи в словаре кажутся окончательными для последней созданной функции. Код выглядит следующим образом:

d = {} def test(**kwargs): for k in kwargs: def f(): print k, kwargs[k] d[k] = f f() test(foo=1, bar=2) print 'should print the same output as before' d['foo']() d['bar']() 

Эти результаты:

 foo 1 bar 2 should print the same output as before bar 2 bar 2 

Любая идея почему?

  • возможно ли что-либо вернуть из функции в python?
  • Boost.Python: функции Wrap для выпуска GIL
  • Имея несколько параметров с def в python
  • Я получаю NameError: имя 'n' не определено
  • Python: Использовать пробелы в имени функции?
  • как определить функцию из строки с помощью python
  • Есть ли функция math nCr в python?
  • Насколько велика может быть входная функция input ()?
  • One Solution collect form web for “Создание функций в цикле”

    У вас возникла проблема с поздним связыванием – каждая функция просматривает k как можно позже (таким образом, при вызове внешнего test это происходит после окончания цикла). Легко фиксируется форсированием раннего связывания: change def f(): to def f(k=k): – значения по умолчанию (правый k в k=k является значением по умолчанию для имени аргумента k , hand k в k=k ) просматриваются в def time, а не во время call , поэтому, по сути, это способ специально найти раннее связывание.

    Если вы беспокоитесь о том, чтобы получить дополнительный аргумент (и, таким образом, его можно назвать ошибочным), существует более сложный способ использования закрытия как «фабрики функций»:

      def make_f(kwargs, k): def f(): print k, kwargs[k] return f 

    и в вашем цикле сделайте f = make_f(kwargs, k) вместо инструкции def .

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