擅长:python、mysql、java
<blockquote>
<p>My understanding is that Python is effectively interpreted line by line.</p>
</blockquote>
<p>这不是正确的思维模式。你知道吗</p>
<p>对整个函数体进行分析,以确定哪些名称引用局部变量,哪些不引用</p>
<p>为了简化示例,下面还提供了<code>UnboundLocalError</code>:</p>
<pre><code>def func():
print(a)
a = 2
func()
</code></pre>
<p>这里,<code>func()</code>编译成以下字节码:</p>
<pre><code> 2 0 LOAD_FAST 0 (a)
3 PRINT_ITEM
4 PRINT_NEWLINE
3 5 LOAD_CONST 1 (2)
8 STORE_FAST 0 (a)
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
</code></pre>
<p>将此与</p>
<pre><code>def gunc():
print(a)
</code></pre>
<p>编译为</p>
<pre><code> 2 0 LOAD_GLOBAL 0 (a)
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
</code></pre>
<p>观察没有赋值给<code>a</code>是如何将引用从局部转到全局的。你知道吗</p>