擅长:python、mysql、java
<p>关于如何避免exec语句,这里有很多很好的建议(这通常是不好的),但是要回答您关于为什么会发生这种情况的问题,更多的是关于列表理解。列表理解创建一个新的作用域,当您在没有globals或locals参数的情况下调用exec时,它使用<code>locals()</code>函数:</p>
<blockquote>
<p>Note: The default locals act as described for function locals() below</p>
</blockquote>
<p><a href="https://docs.python.org/3.7/library/functions.html#exec" rel="nofollow noreferrer">Source</a></p>
<p>在这里,您可以从列表中看到<code>locals()</code>函数的结果:</p>
<pre><code>class Sample:
def __init__(self):
k = 4
print(locals())
exec("print(locals())")
[print(locals()) for x in range(1)]
[exec("print(locals())") for x in range(1)]
Sample()
</code></pre>
<p>输出:</p>
<pre><code>{'k': 4, 'self': <__main__.Sample object at 0x00000000030295C0>}
{'k': 4, 'self': <__main__.Sample object at 0x00000000030295C0>}
{'x': 0, '.0': <range_iterator object at 0x00000000030019F0>}
{'x': 0, '.0': <range_iterator object at 0x00000000030019F0>}
</code></pre>
<p>因此,<code>locals()</code>在exec内部或外部是相同的。是列表理解改变了它。只不过,当您在exec语句之外时,解释器可能会超出列表的局部范围,并在外部范围内找到自我。一旦你打电话给执行官就不会有这样的运气了。你知道吗</p>