我不明白此示例中的错误。print(b)
不应该按Python LegB规则打印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
当Python扫描您的功能时,它将看到分配给b
。此作业创建了特定字节码(LOAD FAST
),该字节将指示Python加载名称b
作为本地变量。
,如果您为函数f
创建的字节码(使用dis
模块),则可以看到此内容:
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)
)。