Python变量作用域和UnboundLocalError

问题描述:

我不明白这个例子中的错误。打印6,由Python的LEGB规则?当解释器在第2行扫描f(a)函数时,是否记住b = 33并放入内存堆或只记得b是局部变量的信息?Python变量作用域和UnboundLocalError

b = 6 
def f(a): 
    print(a) 
    print(b) 
    b = 33 
f(20) 
# UnboundLocalError: local variable 'b' referenced before assignment 

当Python扫描你的函数时,它看到一个赋值为b。此分配会创建指定Python将名称b作为局部变量加载的特定字节码(LOAD FAST)。

你可以看到这一点,如果你拆开字节码(使用dis模块)的功能f创建:

from dis import dis 
dis(f) 
    2   0 LOAD_GLOBAL    0 (print) 
       2 LOAD_FAST    0 (a) 
       4 CALL_FUNCTION   1 
       6 POP_TOP 

    3   8 LOAD_GLOBAL    0 (print) 
      10 LOAD_FAST    1 (b) 
      12 CALL_FUNCTION   1 
      14 POP_TOP 

此相关的指令是:

LOAD_FAST    1 (b) 

它加载名称b作为局部变量。

当遇到print(b),它会尝试加载名称bb尚未确定(转让尚未执行):你引用它(print(b))已进行的分配给它。

+0

dis模块显示发生了什么。它是通过读取函数的全部函数来工作的,然后在屏幕上打印字节码,还是在每行扫描后打印? –

+0

所有'dis'需要创建你所看到的位于'f .__ code__'中,它不会读取任何内容,它使用已存在的内容@MarkoSavic –