Python局部变量与全局变量

Python局部变量与全局变量,第1张

Python局部变量与全局变量

设置和测试

为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题:

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上。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5653357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存