擅长:python、mysql、java
<p>是啊,这有点诡异。类并没有真正引入新的作用域,只是看起来有点像;像这样的构造暴露了差异。在</p>
<p>其思想是,当您使用生成器表达式时,它相当于使用lambda:</p>
<pre><code>class Brie(object):
base= 2
powers= map(lambda i: base**i, xrange(5))
</code></pre>
<p>或显式作为函数语句:</p>
^{pr2}$
<p>在本例中,<code>base</code>显然不在<code>__generatePowers</code>的范围内;两者都会出现异常(除非您不幸地拥有一个<code>base</code>全局,在这种情况下,您得到了一个错误)。在</p>
<p>对于列表理解来说,这是不会发生的,因为它们的内部细节是如何计算的,但是这种行为在python3中消失了,这两种情况下都会同样失败。<a href="http://mail.python.org/pipermail/python-dev/2009-February/086287.html" rel="noreferrer">Some discussion here.</a></p>
<p>可以使用lambda来解决这个问题,该技术与我们以前在嵌套式_作用域之前所依赖的技术相同:</p>
<pre><code>class Brie(object):
base= 2
powers= map(lambda i, base= base: base**i, xrange(5))
</code></pre>