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)
,它会尝试加载名称b
但b
尚未确定(转让尚未执行):你引用它(print(b)
)已进行的分配给它。
dis模块显示发生了什么。它是通过读取函数的全部函数来工作的,然后在屏幕上打印字节码,还是在每行扫描后打印? –
所有'dis'需要创建你所看到的位于'f .__ code__'中,它不会读取任何内容,它使用已存在的内容@MarkoSavic –