<p>你可以循环以避免写这样的东西:</p>
<pre><code>lis.append( lambda: 0 )
lis.append( lambda: 1 )
lis.append( lambda: 2 )
</code></pre>
<p>您的目的是编写返回常量整数的lambda函数。但是您定义并附加了一个返回object <code>i</code>的函数。因此,3个附加函数是相同的。在</p>
<p>创建的函数后面的字节码返回<code>i</code>:</p>
^{pr2}$
<p>调用这些函数中的任何一个返回示例代码中<code>i</code>的最新值<code>2</code>:</p>
<pre><code>In [28]: lis[0]()
Out[28]: 2
</code></pre>
<p>如果删除<code>i</code>对象,则会出现一个错误:</p>
<pre><code>In [29]: del i
In [30]: lis[0]()
-
NameError Traceback (most recent call last)
<ipython-input-30-c9e334d64652> in <module>()
> 1 lis[0]()
<ipython-input-18-15df6d11323a> in <lambda>()
1 lis = []
2 for i in range(3):
> 3 lis.append( lambda: i )
NameError: global name 'i' is not defined
</code></pre>
<hr/>
<p>解决方案可能是继续使用循环来编写包含所需常量的代码,并实际运行该代码:</p>
<pre><code>In [31]: lis = []
...: for i in range(3):
...: exec 'lis.append( lambda: {} )'.format(i)
...:
</code></pre>
<p>结果如下:</p>
<pre><code>In [44]: lis[0]()
Out[44]: 0
In [45]: lis[1]()
Out[45]: 1
In [46]: dis.dis(lis[0])
1 0 LOAD_CONST 1 (0)
3 RETURN_VALUE
In [47]: dis.dis(lis[1])
1 0 LOAD_CONST 1 (1)
3 RETURN_VALUE
</code></pre>