擅长:python、mysql、java
<p>@Boud给出了一个非常好的答案,解释了为什么你的代码不能像你期望的那样工作。重要的是,在lambda中引用<code>i</code>之前,必须计算它的值。下面是一个有点老套的方法:</p>
<pre><code>lis = []
for i in range(3):
lis.append( lambda i=i: i )
</code></pre>
<p>这使用了Python的默认函数参数值特性,例如在函数中可以写下:</p>
^{pr2}$
<p>现在,诀窍是在创建函数(方法、lambda表达式)时,将参数的默认值存储在该点。因此:</p>
<pre><code>j = 10
def f(i=j):
return i
j = 20
print( f(125) ) # no matter that j has been changed, the output is...
>>> 125
</code></pre>
<p>同样的伎俩也适用于lambda。为了更清楚一点:</p>
<pre><code>lis = []
for j in range(3):
lis.append( lambda i=j: i )
# Calling the lambdas
print(lis[1]())
>>> 1
</code></pre>