<p>首先,重要的是<a href="https://docs.python.org/2/library/functions.html#eval" rel="nofollow">read this</a>:</p>
<blockquote>
<p>The expression argument is parsed and evaluated as a Python expression
(technically speaking, a condition list) using the globals and locals
dictionaries as global and local namespace. If the globals dictionary
is present and lacks <code>‘__builtins__’</code>, the current globals are copied
into globals before expression is parsed. This means that expression
normally has full access to the standard <code>__builtin__</code> module and
restricted environments are propagated. If the locals dictionary is
omitted it defaults to the globals dictionary. If both dictionaries
are omitted, the expression is executed in the environment where
<code>eval()</code> is called. The return value is the result of the evaluated
expression`.</p>
</blockquote>
<p>首先要注意的是生成器表达式有自己的作用域(对于dict理解也是如此),因此它有自己的<code>locals()</code>字典。在</p>
<ol>
<li><p>这是因为在全局范围内,<code>globals()</code>和{<cd1>}dict都指向同一个字典,因此dict构造函数可以访问这些变量。</p></li>
<li><p>这里我们再次调用<code>eval()</code>,没有<code>globals()</code>和<code>locals()</code>dict,因此它最终使用全局作用域和它自己的局部作用域(它是空的),并且在这些作用域中没有这样的变量可用。</p></li>
<li><p>记住生成器有自己的作用域,所以在这里调用<code>locals()</code>几乎没有任何区别,这是一个空的dict。</p></li>
</ol>
<p><strong>解决方案:</strong></p>
<pre><code>def test1():
lvar1 = 1
lvar2 = 2
lvar3 = 3
test1_locals = locals()
myDict = dict((name, eval(name, test1_locals)) for name in ["lvar1",
"lvar2",
"lvar3"])
print myDict
print(myDict["lvar1"])
</code></pre>
<p>这是因为我们在一个变量中捕获了test1的<code>locals()</code>,然后在字典理解中使用了该字典,所以它现在可以访问这些变量。在</p>