擅长:python、mysql、java
<p><strong>简短回答</strong>:因为<strong>分配给<code>a</code></strong>(通过写入<code>a = a + a</code>和<code>a = i()</code>),所以<strong>创建了局部变量</strong>。在赋值之前使用变量并不重要。你知道吗</p>
<p>Python通过检查赋值来检查作用域。如果你在某处写了一个赋值,比如<code>a =</code>,<code>a +=</code>,等等,<strong>不管你把它写在函数的什么地方,函数都会把<code>a</code>看作一个局部变量。你知道吗</p>
<p>如果你写:</p>
<pre><code>a = 2
def f():
print(a)
a = 3
</code></pre>
<p>即使在赋值给<code>a</code></strong>之前访问<code>a</code>,它仍将<code>a</code>视为局部变量。Python在这里不做代码路径分析。你知道吗</p>
<p>它在<code>f</code>中看到一个局部变量。如果调用<code>f()</code>,则会出错,因为它会说在实际分配<code>a</code>之前获取它。你知道吗</p>
<p>如果变量不是本地定义的,Python将迭代地检查外部作用域,直到找到一个<code>a</code>。你知道吗</p>
<p>如果在作用域中赋值给,则从外部作用域访问变量的唯一方法是使用<code>nonlocal</code>或<code>global</code>(当然也可以将其作为参数传递)。你知道吗</p>