{{ ['foo', 'bar'|capitalize]|join }}
Как вы можете видеть, это работает с фильтрами и функциями без необходимости использовать set на отдельной строке.
Измените x.append(lambda : pv(v))
на x.append(lambda v=v: pv(v))
.
Вы ожидаете, что «python lambdas привязывается к ссылке, на которую указывает локальная переменная, за сценой», но это не так, как работает Python. Python ищет имя переменной во время вызова функции, а не когда она создается. Использование аргумента по умолчанию работает, потому что аргументы по умолчанию оцениваются при создании функции, а не при ее вызове.
Это не что-то особенное в отношении лямбда. Рассмотрим:
x = "before foo defined"
def foo():
print x
x = "after foo was defined"
foo()
печатает
after foo was defined
Закрытие лямбды содержит ссылку на используемую переменную, а не ее значение, поэтому, если значение переменной позже изменяется, значение в закрытии также изменяется. То есть значение переменной замыкания разрешается при вызове функции, а не при ее создании. (Поведение Python здесь не является чем-то необычным в мире функционального программирования, для чего оно стоит.)
Существует два решения:
lambda v=v: pv(v)
(lambda v: lambda: pv(v))(v)
functools.partial
или использование отдельной вспомогательной функции для создания замыканий (def make_closure(v): return lambda: pv(v)
, вы можете поместить ее вtest
). – user 4 May 2012 в 17:40lambda par1, par2 = l3_e : self.parse_l4(par1, par2)
? – Hassan Syed 4 May 2012 в 17:46v
сам по себе является ссылкой (в отличие отint
), тогда я беру его, то будет not i> быть «глубоким». копировать? – Aaron McDaid 4 March 2014 в 16:30