Python变量作用域和UnboundLocalError
我不理解这个例子中的错误。根据Python-LEGB规则,Python变量作用域和UnboundLocalError,python,python-3.x,function,global-variables,Python,Python 3.x,Function,Global Variables,我不理解这个例子中的错误。根据Python-LEGB规则,print(b)print6?当解释器扫描第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。此赋值创
print(b)
print6
?当解释器扫描第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)
)。dis模块显示了发生的情况。它是通过读取整个函数体来工作的,然后在屏幕上打印字节码,还是在每次行扫描后打印?所有dis
需要创建的内容都位于f中。它不读取任何内容,它使用已经存在的@MarkoSavic