<p>这是一个非常微妙的观点。因此,如果您阅读<a href="https://docs.python.org/3/library/functions.html#eval" rel="nofollow noreferrer">documentation for ^{<cd1>}</a>,它没有提到为全局变量和局部变量提供参数的情况,但我相当确定它的工作原理与<a href="https://docs.python.org/3/library/functions.html#exec" rel="nofollow noreferrer">for ^{<cd2>}</a>相同:</p>
<blockquote>
<p>If <code>exec</code> gets two separate objects as globals and locals, the code will
be executed as if it were embedded in a class definition.</p>
</blockquote>
<p>在类定义中,<em>函数无法访问其封闭范围</em>。因此,这与错误完全相同:</p>
<pre><code>>>> class Foo:
... value = [1,2,3]
... print([x in value for x in [2,4,6]])
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in Foo
File "<stdin>", line 3, in <listcomp>
NameError: name 'value' is not defined
</code></pre>
<p>因为列表理解是通过在引擎盖下创建函数对象来工作的。这也是为什么需要<code>self.some_method</code>来访问类中定义的其他方法的名称。有关上述内容的更多信息,请参见<a href="https://stackoverflow.com/questions/13905741/accessing-class-variables-from-a-list-comprehension-in-the-class-definition">the excellent accepted answer here</a></p>
<p>因此,这与:</p>
<pre><code>>>> def foo():
... x = 3
... return eval('(lambda: x + 1)()', globals(), locals())
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
File "<string>", line 1, in <module>
File "<string>", line 1, in <lambda>
NameError: name 'x' is not defined
</code></pre>
<p>但是,这很管用:</p>
<pre><code>>>> def foo():
... x = 3
... return eval('x + 1', globals(), locals())
...
>>> foo()
4
</code></pre>
<p>因为不涉及(非)封闭的功能范围</p>
<p>最后,以下原因起作用:</p>
<pre><code>>>> def foo():
... values = [1,2,3]
... return eval('[x+2 for x in values]', globals(), locals())
...
>>> foo()
[3, 4, 5]
</code></pre>
<p>这是因为理解的<em>最左边的</em>for子句中的iterable不是在理解的函数范围内计算的,而是在理解发生的范围内计算的(它实际上是作为参数传递的)。您可以在列表的分解中看到这一点:</p>
<pre><code>>>> import dis
>>> dis.dis('[x+2 for x in values]')
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x7fe28baee3a0, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (values)
8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x7fe28baee3a0, file "<dis>", line 1>:
1 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 12 (to 18)
6 STORE_FAST 1 (x)
8 LOAD_FAST 1 (x)
10 LOAD_CONST 0 (2)
12 BINARY_ADD
14 LIST_APPEND 2
16 JUMP_ABSOLUTE 4
>> 18 RETURN_VALUE
</code></pre>
<p>注意,<code>values</code>被计算,对其调用<code>iter</code>,其结果被传递给函数:</p>
<pre><code> 6 LOAD_NAME 0 (values)
8 GET_ITER
10 CALL_FUNCTION 1
</code></pre>
<p>“函数”基本上只是一个带有append的循环,有关列表理解是如何工作的,请参见:<code>Disassembly of <code object <listcomp> at 0x7fe28baee3a0, file "<dis>", line 1></code></p>