• Python教程:global、nonlocal关键字区别与用法


    一:global:在函数内部引用/声明全局变量

    在自定义函数时,有时候需要引用函数外的一些全局变量,如果不需要修改全局变量的内容,则可以直接引用,像下面这样:

    c = 999
    
    def func():
        print(c)
    if __name__ == '__main__':
        func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    函数的作用只是输出变量 c 的值,并未对 c 进行修改,所以不会报错。但如果想要在函数内部对全局变量进行一个修改,则需要使用global关键字,

    c = 999
    
    def func():
        for i in range(10):
            c += 1
    
    
    if __name__ == '__main__':
        func()
        print(c)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面的代码中,在func函数中尝试修改 c 这个变量,但会出现如下错误:

    UnboundLocalError: local variable ‘c’ referenced before assignment

    意思是:赋值之前引用了局部变量。global关键字可以解决这个问题,如下:

    c = 999
    
    def func():
        global c        # 在修改前使用global关键字
        for i in range(10):
            c += 1
    if __name__ == '__main__':
        func()
        print(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    另外,global还可以帮助我们在函数内部声明一个全局变量,如下:

    def func():
        global c        # 在函数内部声明一个全局变量
        c = 100
    if __name__ == '__main__':
        func()
        print(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    二:nonlocal关键字

    nonlocal的作用于global类似,只不过global是在函数内部引用/修改全局变量,而nonloca是在内层函数中引用/修改外层函数定义的局部变量(非全局变量)。这种现象也成为闭包。

    def func():
        c = 100
        def foo():
            for i in range(10):     # 对外层函数的c变量进行修改
                c += 1
        foo()
        print(c)
    
    if __name__ == '__main__':
        func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    报错如下:

    UnboundLocalError: local variable 'c' referenced before assignment
    
    • 1

    与上面的错误相同,但这时候不能再使用global关键字了,而要使用nonlocal关键字,(如果使用了global,则相当于又声明的一个新的变量)

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    def func():
        c = 100
        def foo():
            nonlocal c
            for i in range(10):     # 对外层函数的c变量进行修改
                c += 1
        foo()
        print(c)
    
    if __name__ == '__main__':
        func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这样就不会报错了,输出结果是110.

    总的来说:global关键字用来在函数或其它局部作用域中使用全局变量。但是如果不使用全局变量也可以不适用global关键字声明,nonlocal关键字用来在函数或其它作用域中使用外层(非全局)变量。

  • 相关阅读:
    (复刷) 面试题02.07.链表相交
    高速FPGA设计实现结构和优化_(五)综合优化
    全景环视前装市场“变天”,这家中国本土供应商首次跻身份额第一
    word交叉引用的使用
    python爬取新闻,制作词云图
    第七章,相似矩阵及其应用,5-正定二次型
    创新生态,智能升级 | 易知微数字孪生智慧园区,构筑技术与产业发展的“智慧融合体”
    c高级 day1
    【构建并发程序】4-原子变量-CAS-ABA问题
    苯硫酚荧光探针 激发波长465 nm
  • 原文地址:https://blog.csdn.net/qdPython/article/details/126056891