擅长:python、mysql、java
<p>看一看拆卸过程可能会清楚发生了什么:</p>
<pre><code>>>> def f():
... print a
... print b
... a = 1
>>> import dis
>>> dis.dis(f)
2 0 LOAD_FAST 0 (a)
3 PRINT_ITEM
4 PRINT_NEWLINE
3 5 LOAD_GLOBAL 0 (b)
8 PRINT_ITEM
9 PRINT_NEWLINE
4 10 LOAD_CONST 1 (1)
13 STORE_FAST 0 (a)
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
</code></pre>
<p>如您所见,访问a的字节码是<code>LOAD_FAST</code>,访问b的字节码是<code>LOAD_GLOBAL</code>。这是因为编译器已识别出函数内分配给的,并将其分类为局部变量。全局变量的局部变量访问机制与全局变量的访问机制有本质的不同,全局变量在帧的变量表中静态地分配一个偏移量,这意味着查找是一个快速索引,而不是全局变量更昂贵的dict查找。因此,Python将<code>print a</code>行读取为“获取插槽0中保存的局部变量'a'的值并打印它”,当它检测到该变量仍然未初始化时,会引发异常。</p>