设置和测试
为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题:
a=0def test1(): print(a)test1()
版画
0。因此,调用此函数不是问题,而是在下一个函数上:
def test2(): print(a) # Error : local variable 'a' referenced before assignment a=0test2()
我们收到一个错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test2UnboundLocalError: local variable 'a' referenced before assignment
拆卸
我们可以反汇编这两个函数(第一个 Python 2 ):
>>> import dis>>> dis.dis(test1) 20 LOAD_GLOBAL 0 (a) 3 PRINT_ITEM 4 PRINT_newline 5 LOAD_ConST 0 (None) 8 RETURN_VALUE
我们看到第一个函数自动加载global
a,而第二个函数:
>>> dis.dis(test2) 20 LOAD_FAST 0 (a) 3 PRINT_ITEM 4 PRINT_newline 35 LOAD_ConST 1 (0) 8 STORE_FAST 0 (a) 11 LOAD_ConST 0 (None) 14 RETURN_VALUE
看到
a分配给它的内容,尝试从本地进行LOAD_FAST(作为优化的问题,因为函数在运行前已预先编译为字节码)。
如果我们在 Python 3中 运行此命令, 则会 看到几乎相同的效果:
>>> test2()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test2UnboundLocalError: local variable 'a' referenced before assignment>>> >>> import dis>>> dis.dis(test1) 20 LOAD_GLOBAL 0 (print) 3 LOAD_GLOBAL 1 (a) 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 10 LOAD_ConST 0 (None) 13 RETURN_VALUE>>> dis.dis() # disassembles the last stack trace 20 LOAD_GLOBAL 0 (print) --> 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 3 10 LOAD_ConST 1 (0) 13 STORE_FAST 0 (a) 16 LOAD_ConST 0 (None) 19 RETURN_VALUE
我们看到错误再次出现在LOAD_FAST上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)