擅长:python、mysql、java
<p>你可以这样做:</p>
<pre><code># recurse.py
def func():
global x
x += 1
with open('recurse.py', 'r') as f:
try:
exec(f.read(), {'x': x})
except RuntimeError:
print('maximum recursion depth reached at', x)
try:
x
except NameError:
x = 0
func()
</code></pre>
<p>您的初始示例的问题实际上并不是特定于<code>exec</code>。只是程序本身在调用<code>func</code>之前将<code>x</code>设置为零。因此,传入起始值<code>x</code>没有任何效果:您正在执行的代码将设置一个新值<code>x</code>。在这个新版本中,try/except块测试名称是否已经存在,然后将其初始化为零。你知道吗</p>
<p>(我在这里使用RuntimeError是因为我没有引入递归错误的Python3.5,但是它应该和递归错误一样工作。)</p>