擅长:python、mysql、java
<p>生成器理解实际上是显式定义生成器的简写。在幕后,你想写的东西相当于:</p>
<pre><code>class Whatevs(object):
foo = 3
def _gen():
for _ in range(10):
yield foo
zap = list(_gen())
</code></pre>
<p>不幸的是,您不能从生成器或类主体中定义的函数内部访问像<code>foo</code>这样的作用域变量(并且您不能使用<code>Whatevs.foo</code>,因为<code>Whatevs</code>还不存在。你知道吗</p>
<p>一种方法是将代码移到类主体之外:</p>
<pre><code>class Whatevs(object):
foo = 3
Whatevs.zap = list(Whatevs.foo for _ in range(10))
</code></pre>
<p>另一个选项是将foo转换为参数:</p>
<pre><code>def _init_zap(foo):
return list(foo for _ in range(10))
class Whatevs(object):
foo = 3
zaps = _init_zap(foo)
</code></pre>
<p>在Python2.x中,列表理解在这里起作用,但Python3.x的一个变化是,列表理解也使用单独的作用域(即隐藏函数),就像生成器理解一样,因此列表理解在Python3中也会中断。你知道吗</p>