Python可变范围和Unboundlocalerror



我不明白此示例中的错误。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))。

相关内容

  • 没有找到相关文章

最新更新