Python中的Global和nonlocal

本文深入解析Python中的变量作用域,包括局部变量、全局变量及非全局变量的引用和修改规则,通过具体示例代码展示了global和nonlocal关键字的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

以上论述为自身理解,如有幸被小伙伴们看到,请大家多多包涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值