我不明白这个例子中的错误。 Python LEGB规则不应该print(b)
打印6
吗?当解释器扫描第2行中的f(a)
函数时,是否会记住b = 33
并放入内存堆或只记得b
是局部变量的信息?
b = 6
def f(a):
print(a)
print(b)
b = 33
f(20)
# UnboundLocalError: local variable 'b' referenced before assignment
答案 0 :(得分:3)
当Python扫描您的函数时,它会看到b
的赋值。此赋值创建特定的字节码(LOAD FAST
),指示Python将名称b
作为局部变量加载。
如果您反汇编为函数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
这里的相关指示是:</ p>
LOAD_FAST 1 (b)
将名称b
加载为局部变量。
遇到print(b)
时,会尝试加载名称b
,但尚未定义b
(尚未执行分配):您引用了它({{ 1}})在对它进行赋值之前。