Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python变量作用域和UnboundLocalError_Python_Python 3.x_Function_Global Variables - Fatal编程技术网

Python变量作用域和UnboundLocalError

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。此赋值创

我不理解这个例子中的错误。根据Python-LEGB规则,
print(b)
print
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)
)。

dis模块显示了发生的情况。它是通过读取整个函数体来工作的,然后在屏幕上打印字节码,还是在每次行扫描后打印?所有
dis
需要创建的内容都位于
f中。它不读取任何内容,它使用已经存在的@MarkoSavic