擅长:python、mysql、java
<p>我不知道你到底想实现什么,也不知道这是不是一个坏主意(就<code>np.vectorize</code>),但你面临的问题是因为<a href="https://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture">the way python makes closures</a>。引述对相关问题的回答:</p>
<blockquote>
<p>Scoping in Python is lexical. A closure will always
remember the name and scope of the variable, not the object it's
pointing to. Since all the functions in your example are created in
the same scope and use the same variable name, they always refer to
the same variable.</p>
</blockquote>
<p>换句话说,当您在<code>n</code>上进行闭包时,实际上并没有关闭<code>n</code>的状态,只是关闭了名称。因此,当<code>n</code>更改时,闭包中的值也会更改。这对我来说很意外,但是<a href="https://stackoverflow.com/a/2295659/1011724">others find it natural</a></p>
<p>下面是一个使用<code>partial</code>的修复程序:</p>
<pre><code>from functools import partial
.
.
.
def func(x, n):
return x * n
for n in range(10):
vfuncd[n] = np.vectorize(partial(func, n=n))
</code></pre>
<p>或其他使用工厂方法的</p>
<pre><code>def func_factory(n):
return lambda x: x * n
for n in range(10):
vfuncd[n] = np.vectorize(func_factory(n))
</code></pre>