Scipy Hermite多项式列表用作Lambda函数时表现异常

时间:2019-04-29 09:36:12

标签: python scipy

我想构建一个包含不同顺序的Hermite polynomials(指向scipy的hermite文档的链接)的容器。根据文档所说,我希望scipy.special.hermite接受命令n并返回一个函数-命令n的Hermite多项式。

这似乎可以与单个功能配合使用。但是,当我尝试通过将Hermitte多项式实现为lambda函数来使用它们的列表时,似乎它们都将重置为最后一个多项式:

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

有没有一种方法可以正确地初始化一个包含不同Hermite多项式的容器,而在容器关注语句中,先前的元素不会被后续的元素覆盖?谢谢!

1 个答案:

答案 0 :(得分:0)

正如沃伦的评论所说,这是由于Python的后期绑定机制所致。为了避免这种情况,一种解决方案是将循环变量作为函数的默认参数之一包括在内。即

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

建议阅读:https://docs.python-guide.org/writing/gotchas/#late-binding-closures