<p>有两个问题,我怀疑使你的代码不做你想要的。主要问题是不能使用<code>exec</code>直接修改函数中的局部变量。如果您在模块的顶层(全局和局部名称空间相同)运行它,那么它可以修改全局变量。但是函数中的局部变量在Python中得到了特殊的处理,不能总是把它们弄乱。你知道吗</p>
<p>除了一个<code>exec</code>调用外,其他所有调用都在修改<code>locals()</code>返回的字典(默认情况下,当不传递名称空间字典时,或者当显式传递它<code>locals()</code>)。不幸的是,对函数中<code>locals()</code>的修改对名称空间中的实际变量没有任何影响,只是(暂时)在dictionary对象中。当<code>locals()</code>再次被调用并且命名空间中的实际值再次保存到字典中时,修改将被撤消。你知道吗</p>
<p>所以大多数<code>exec</code>调用根本没有效果。它们不会修改<code>a</code>,所以您会一直打印出它以前的值(要么是您初始化它的值,要么是在赋值之后<code>None</code>,原因我将在下面解释)。你知道吗</p>
<p>另一个问题是在您进行的“modified”exec调用中,您将返回值从<code>exec</code>分配到<code>a</code>。这并不是你所期望的。<code>exec</code>函数总是返回<code>None</code>,这就是<code>a</code>对函数其余部分的值。你知道吗</p>
<p>如果要计算Python表达式并返回它,请使用<code>eval</code>而不是<code>exec</code>。但是不能将语句放在<code>eval</code>中(因此只有“modified”调用才能像编写的那样工作)。你知道吗</p>
<p>以下是一些适合您的方法:</p>
<pre><code># use eval
a = eval("dane.get('" + b + "', None)")
# use a separate namespace for exec, and assign the value to a separately afterwards
namespace = {}
exec("a = dane.get('" + b + "', None)", namespace)
a = namespace['a']
# or the obvious, don't use either eval or exec, and just call the method you want directly:
a = dane.get(b, None)
</code></pre>
<p>如果有其他选择的话,使用<code>eval</code>或<code>exec</code>通常是个坏主意。您肯定不应该<code>exec</code>任何您不完全信任的字符串,因为它可以运行任意Python代码。你的例子太简单了,不太清楚你到底想达到什么目的,但我很肯定,对于你真正的目标,会有比<code>exec</code>更好的解决方案。你知道吗</p>