擅长:python、mysql、java
<p>在第一种情况下,您引用的是<code>nonlocal</code>变量,这是正常的,因为没有称为<code>a</code>的局部变量。在</p>
<pre><code>def toplevel():
a = 5
def nested():
print(a + 2) # theres no local variable a so it prints the nonlocal one
nested()
return a
</code></pre>
<p>在第二种情况下,创建一个局部变量<code>a</code>,这也很好(局部<code>a</code>将与非本地变量不同,这就是为什么原始的{<cd2>}没有被更改)。在</p>
^{pr2}$
<p>在第三种情况下,您创建了一个局部变量,但在此之前有<code>print(a+2)</code>,这就是引发异常的原因。因为<code>print(a+2)</code>将引用在该行之后创建的局部变量<code>a</code>。在</p>
<pre><code>def toplevel():
a = 5
def nested():
print(a + 2) # tries to print local variable a but its created after this line so exception is raised
a = 7
nested()
return a
toplevel()
</code></pre>
<p>要实现您想要的,您需要在内部函数中使用<code>nonlocal a</code>:</p>
<pre><code>def toplevel():
a = 5
def nested():
nonlocal a
print(a + 2)
a = 7
nested()
return a
</code></pre>