Список полиномов скипитовых эрмитов ведет себя неожиданно при использовании в качестве лямбда-функций - PullRequest
1 голос
/ 29 апреля 2019

Я хочу построить контейнер из полиномов Эрмита (ссылка на документ Эрмита Сципи) разных порядков. Из того, что говорит доктор, я ожидаю, что scipy.special.hermite примет заказ n и вернет функцию - полином Эрмита порядка n.

Кажется, это хорошо работает с отдельными функциями. Но когда я пытаюсь использовать список полиномов Эрмита, реализуя их как лямбда-функции, кажется, что все они будут сброшены до последнего полинома:

from scipy.special import hermite
base_funcs = [lambda x: hermite(i)(x) for i in range(5)]

[f(1) for f in base_funcs]
Out[40]: [-20.0, -20.0, -20.0, -20.0, -20.0]
hermite(0)(1)
Out[41]: 1.0
hermite(4)(1)
Out[42]: -20.0

Есть ли способ правильно инициировать контейнер различных полиномов Эрмита, без того, чтобы предыдущие элементы были перезаписаны последующими в операторе восприятия контейнера? Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2019

Как говорится в комментарии Уоррена, это связано с поздним механизмом привязки Python. Чтобы обойти это, одним из решений является включение переменной цикла в качестве одного из аргументов функции по умолчанию. т.е.

[lambda x, i=i: hermite(i)(x) for i in range(5)]

Рекомендуемое чтение: https://docs.python -guide.org / writing / gotchas / # late-binding-closures .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...