西比隐士多项式列表 当用作 lambda 函数时,行为异常



我想构建一个不同顺序的Hermite多项式容器(链接到scipy的Hermite doc)。从文档所说,我希望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 多项式的容器,而不会在容器理解语句中被后续元素覆盖以前的元素?谢谢!

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

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

推荐阅读:https://docs.python-guide.org/writing/gotchas/#late-binding-closures。

相关内容

  • 没有找到相关文章

最新更新