Python变量范围和UnboundLocalError

时间:2017-09-21 00:33:15

标签: python python-3.x function global-variables

我不明白这个例子中的错误。 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

1 个答案:

答案 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}})在对它进行赋值之前。