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

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

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 

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

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 .

Interesting Posts

создавать списки уникальных имен в for -loop в python

Автоматически импортировать модули при вводе интерпретатора python или ipython

Могу ли я написать screencapture в Python

Ошибка IDLE при открытии в Mac OS X

TypeError: module .__ init __ () принимает не более 2 аргументов (3 данных)

Ошибка pyinstaller: не удается найти scipy (Нет модуля с именем _ufuncs_cxx)

колба перед запросом – добавление исключения для определенного маршрута

Ошибка импорта django – нет модуля с именем core.management

Можно ли добавлять заголовки в электронные письма, отправляемые приложением?

Pandas Dataframe: разделение столбца на несколько столбцов, выравнивание по правому краю элементов ячейки

Добавление и умножение столбцов массива numpy с другим массивом

Объявление кодировки в Python

Обманывать категорически отсутствующие ценности в scikit-learn

Как реализованы встроенные словари Python

Python: как импортировать другие файлы Python

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