<p><strong>问题:</strong></p>
<p>当试图解析变量引用时,Python首先检查本地范围,然后检查任何封闭函数的本地范围。例如,此代码:</p>
<pre><code>def foo():
x=23
def bar():
return x +1
return bar
print(foo()())
</code></pre>
<p>将运行并打印出<code>24</code>,因为当<code>x</code>在<code>bar</code>内被引用时,由于本地作用域中没有<code>x</code>,它在封闭函数(<code>foo</code>)的作用域中找到它。但是,一旦您试图赋值给一个变量,Python就假定它是在本地范围内定义的。所以这个:</p>
^{pr2}$
<p>将抛出一个<code>UnboundLocalError</code>,因为我试图分配给<code>x</code>,这意味着它将在本地作用域中查找,但我试图分配给它的值是基于封闭作用域中的<code>x</code>。由于赋值将<code>x</code>的搜索限制在本地范围内,因此找不到它,我得到了错误。在</p>
<p>因此,您的错误出现是因为else子句中的<code>testerNum -= 1</code>行,它将搜索<code>testerNum</code>限制在它不存在的本地范围内。在</p>
<p><strong>修复:</strong></p>
<p><code>global</code>声明不正确,因为正如您所指出的,<code>testerNum</code>没有在全局范围内定义。我不熟悉Spyder,也不知道它为什么在那里工作,但它似乎在全局范围内有一个<code>testerNum</code>变量。在</p>
<p>如果您使用Python3,那么可以通过将<code>global testerNum</code>行改为<code>nonlocal testerNum</code>来解决这个问题,这只是告诉Python,尽管被分配了,testerNum并没有在本地范围内定义,而是继续向外搜索。在</p>
<pre><code>def foo():
x=23
def bar():
nonlocal x
x = x + 1
return x
return bar
>>> print(foo()())
24
</code></pre>
<p>Python2或3中的另一个方法是传递<code>testerNum</code>,正如Brambor在他们的答案中所描述的那样。在</p>