scipy Hermite 多项式列表在用作 lambda 函数时出现意外行为
List of scipy hermite polynomials behave unexpectedly when used as lambda functions
我想构建一个包含不同订单的 Hermite polynomials(link 到 scipy 的 hermite 文档)的容器。根据文档所说,我希望 scipy.special.hermite
接受阶 n
和 return 函数 - 阶 n
.
的 Hermite 多项式
这似乎适用于单一功能。但是当我尝试通过将它们实现为 lambda 函数来使用 Hermitte 多项式列表时,它们似乎都将被重置为最后一个多项式:
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。
我想构建一个包含不同订单的 Hermite polynomials(link 到 scipy 的 hermite 文档)的容器。根据文档所说,我希望 scipy.special.hermite
接受阶 n
和 return 函数 - 阶 n
.
这似乎适用于单一功能。但是当我尝试通过将它们实现为 lambda 函数来使用 Hermitte 多项式列表时,它们似乎都将被重置为最后一个多项式:
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。