<h2>有什么问题</h2>
<p>您可以从<a href="https://docs.python.org/3/faq/programming.html#id10" rel="nofollow noreferrer">official python documentation</a>中读取它,但简而言之</p>
<ul>
<li>For循环不生成新的变量范围</李>
<li>lamba中的变量指向<code>mwe()</code>的范围,只有在调用lambda时才读取该值</李>
</ul>
<>考虑这个</P>
<pre class="lang-py prettyprint-override"><code>x = 5
def myfunc():
print(x)
mylambda = lambda : print(x)
x = 99
myfunc()
mylambda()
</code></pre>
<p>您认为控制台将打印什么内容?99,对吗<em>(是的,两种情况下都是99)</em>。请注意lambda的行为方式与常规函数完全相同;如果未在函数作用域中定义变量,python将从父作用域中搜索该变量。注意,在像这样的for循环之后</p>
<pre class="lang-py prettyprint-override"><code>for x in range(5)
pass
print(x)
</code></pre>
<p><code>x</code>的值将为5。这就是为什么您创建的所有函数都具有相同的值(最后一个)的原因</p>
<h2>那么,如何解决这个问题呢</h2>
<p><sup><em>很抱歉没有将示例代码复制粘贴到我的示例中。我正在用手机写答案,所以写简单的例子就容易多了。我希望你能从这些例子中得到答案</em></sup></p>
<p>有三种方法可以解决这个问题</p>
<h2>一,。使用lamba的局部变量</h2>
<p>也就是说,而不是</p>
<pre class="lang-py prettyprint-override"><code>a, b = 5, 8
func = lambda x: (x + a)/b
</code></pre>
<p>使用</p>
<pre class="lang-py prettyprint-override"><code>a, b = 5, 8
func = lambda x, a0=a, b0=b: (x + a0)/b0
</code></pre>
<p>为清晰起见,lambda的局部变量附加了零(将使用相同的变量名)。请注意,这与</p>
<pre class="lang-py prettyprint-override"><code>a, b = 5, 8
def func(x, a0=a, b0=b):
return (x + a0)/b0
</code></pre>
<p>在for循环中使用<code>def func()</code>语法也是一个不错的选择</p>
<h2>二,。使用高阶函数</h2>
<p>我的意思是,因为函数在python中是对象(或:<a href="https://en.m.wikipedia.org/wiki/First-class_citizen" rel="nofollow noreferrer">first-class citizens</a>),所以可以创建一个返回函数的函数。将函数作为参数或返回函数的函数称为<em>高阶函数</em>。您可以使用此选项创建更高阶的函数:</p>
<pre class="lang-py prettyprint-override"><code>def get_func(a,b):
return lambda x: (x+a)/b
</code></pre>
<p>或者,为什么不呢</p>
<pre class="lang-py prettyprint-override"><code>def get_func(a,b):
def inner(x):
return (x+a)/b
return inner
</code></pre>
<p>之后,只需在循环中使用</p>
<pre class="lang-py prettyprint-override"><code>for i in range(5):
a, b = get_params() # your logic here
func = get_func(a,b)
</code></pre>
<p>这将起作用,因为get_func有自己的作用域</p>
<h2>三,。使用<code>partial()</code></h2>
<p>内置functools有一个很棒的助手函数,名为partial,它也可以做您想要的事情</p>
<pre class="lang-py prettyprint-override"><code>from functools import partial
def base_func(x, a, b):
return (x-a)/b
funcs = []
for i in range(5):
a, b = get_params() # your logic here
func = partial(base_func, a=a, b=b)
funcs.append(func)
</code></pre>