<p>你就快到了。您正试图修改全局变量,因此必须添加<code>global</code>语句:</p>
<pre><code>old_string = "didn't work"
new_string = "worked"
def function():
exec("global old_string; old_string = new_string")
print(old_string)
function()
</code></pre>
<p>如果运行以下版本,您将看到您的版本中发生了什么:</p>
<pre><code>old_string = "didn't work"
new_string = "worked"
def function():
_locals = locals()
exec("old_string = new_string", globals(), _locals)
print(old_string)
print(_locals)
function()
</code></pre>
<p>输出:</p>
<pre><code>didn't work
{'old_string': 'worked'}
</code></pre>
<p>运行它的方式是,尝试在<code>exec</code>中修改函数的局部变量,这基本上是未定义的行为。请参阅<a href="https://docs.python.org/3/library/functions.html#exec" rel="noreferrer">^{<cd2>} docs</a>中的警告:</p>
<blockquote>
<p><strong>Note:</strong> The default <em>locals</em> act as described for function <code>locals()</code> below: modifications to the default <em>locals</em> dictionary should not be attempted. Pass an explicit <em>locals</em> dictionary if you need to see effects of the code on <em>locals</em> after function <code>exec()</code> returns.</p>
</blockquote>
<p>以及<a href="https://docs.python.org/3/library/functions.html#locals" rel="noreferrer">^{<cd4>}</a>上的相关警告:</p>
<blockquote>
<p><strong>Note:</strong> The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.</p>
</blockquote>