将global foobar行添加到get_foobar()的顶部
这将告诉字节码编译器您要使用全局范围而不是局部引用此函数中的变量。在
赋值将变量的作用域隐式地更改为整个函数作用域的局部范围。在
在字节码中:## code input (local)
def test():
print foobar
foobar = 2
## bytecode output
#
# 3 0 LOAD_FAST 0 (foobar)
# 3 PRINT_ITEM
# 4 PRINT_NEWLINE
#
# 4 5 LOAD_CONST 1 (2)
# 8 STORE_FAST 0 (foobar)
# 11 LOAD_CONST 0 (None)
# 14 RETURN_VALUE
## code input (global)
def test():
global foobar
print foobar
foobar = 2
## bytecode output
#
# 4 0 LOAD_GLOBAL 0 (foobar)
# 3 PRINT_ITEM
# 4 PRINT_NEWLINE
#
# 5 5 LOAD_CONST 1 (2)
# 8 STORE_GLOBAL 0 (foobar)
# 11 LOAD_CONST 0 (None)
# 14 RETURN_VALUE
注意使用LOAD_FAST和{},而不是LOAD_GLOBAL和{
您可以使用此代码快速转储函数的字节码:
^{pr2}$