Python中的Global和nonlocal
python小白:
1.python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
2.global 是指针对函数外部的变量,在函数内部声明,即可修改外部变量
3.nonlocal 是指用来在函数和其他作用域中使用外层(非全局)变量
def scope_test():
def do_local():
spam="local spam"
print(spam,id(spam))
def do_nonlocal():
nonlocal spam
print(spam,id(spam))
spam='nonlocal spam'
print(spam,id(spam))
def do_global():
global spam
spam='global spam'
print(spam,id(spam))
spam='test spam'
print(spam,id(spam))
do_local()
print("after local assignment:",spam,id(spam))
do_nonlocal()
print('after nonlocal assignment:',spam,id(spam))
do_global()
print('after global assignment:',spam,id(spam))
scope_test()
print('in global scope:',spam,id(spam))
运行结果
============ RESTART: C:\Users\TJWT2\Desktop\1.py ===============
test spam 58132184
local spam 58131904
after local assignment: test spam 58132184
test spam 58132184
nonlocal spam 58131984
after nonlocal assignment: nonlocal spam 58131984
global spam 58132104
after global assignment: nonlocal spam 58131984
in global scope: global spam 58132104
在本次运行结果中
do_local 中重新定义了局部变量spam 指向了新的id
在函数外部调用的仍为scope_test()中定义的spam
do_nonlocal中重新定义了spam并且将scope_test()中的spam也指向do_nonlocal中的同一个spam
do_global中重新定义了spam指向了新的id
print时仍指向do_nonlocal中的定义的spam
在函数scope_test()外部调用后,显示的为do_global中定义的spam
目前的理解为,在scope_test()中的调用是先局部后整体,故而在函数内部应该显示的为nonlocal定义的spam,但在函数外部只先整体在局部,故而显示global中定义的spam
以上论述为自身理解,如有幸被小伙伴们看到,请大家多多包涵。