zoukankan      html  css  js  c++  java
  • python--global、nonlocal、闭包

    global

    局部变量里不加global是不能更改全局变量的,只是不能改数字和字符串,像列表,字典,集合局部变量是可以更改的

    • globals() 查看全局作用域中的名字
    • locals() 查看当前作用域中的名字

    全局与局部变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

    当全局变量与局部变量同名时:

    • 在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
    • 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
    • 如果未在函数中指定return,那这个函数的返回值为None
    name = 'zz'
    
    
    def change_name(name):
        print('before change', name)
        name = 'zouzou'  # 这个函数就是这个变量的作用域
        print('after change', name)
    
    
    name = 'lalala'
    change_name(name)
    print(name)  # 打印的是全局变量

    结果:

    before change lalala
    after change zouzou
    lalala
    school = '清华'
    
    
    def change_name(name):
        global school  # 将函数里的局部变量改为全局变量,不能该name
        print('before change', name)
        name = 'zouzou'  # 这个函数就是这个变量的作用域
        print('after change', name)
        school = '北大'
    
    
    name = 'zz'
    change_name(name)
    print(school)  # 打印的是改过后的全局变量

    结果:

    before change zz
    after change zouzou
    北大

    列表,字典,集合局部变量是可以更改的

    names = ['zouzou', '24', 'IT']
    
    
    def name():
        names[0] = 'zz'
        print(names)
    
    
    name()
    print(names)

    结果:

    ['zz', '24', 'IT']
    ['zz', '24', 'IT']

    nonlocal

    nonlocal: 把离他最近的一层的变量拿过来.不会找全局,会把拿过来的那个变量重新赋值,如果局部作用域里没有,全局里有,则会报错

    a = 1
    
    
    def fun_1():
        a = 2
    
        def fun_2():
            def fun_3():
                nonlocal a
                a = 4
                print(a)
    
            print(a)
            fun_3()
            print(a)
    
        print(a)
        fun_2()
        print(a)
    
    
    print(a)
    fun_1()
    print(a)

    结果:

    1
    2
    2
    4
    4
    4
    1

    闭包

    闭包就是内层函数, 对外层函数(非全局)的变量的引⽤用. 叫闭包

    我们可以使用__closure__来检测函数是否是闭包. 使⽤用函数名.__closure__返回cell就是闭包. 返回None就不是闭包

    闭包的好处:

    • 安全(变量写在全局是不安全的)
    • 常驻内存.提高效率(如果不是闭包,执行完这个函数,变量就销毁了,是闭包,发现里面的函数也用到外面函数的变量,则执行完外面的函数,变量一直在内存里)
    def func():
        name = "zou"  # 常驻内存 .防止其他程序改变这个变量
    
        def inner():
            print(name)  # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存
            print(inner.__closure__)  # 查看函数是否是闭包
    
        return inner
    
    
    ret = func()
    ret()  # 执行的是inner()

    结果:

    zou
    (<cell at 0x02DC6770: function object at 0x02FE4C90>, <cell at 0x02FEB0B0: str object at 0x02DC67C0>)
    def func():
        name = "zou"  # 常驻内存 .防止其他程序改变这个变量
    
        def inner():
            print('哈哈')
    
        print(inner.__closure__)
        return inner
    
    
    ret = func()
    ret()  # 执行的是inner()

    结果:

    None
    哈哈

  • 相关阅读:
    ColorPix——到目前为止最好用的屏幕取色器
    ES+VBA 实现批量添加网络图片
    SQL语句-delete语句
    Visual C++ 2013 and Visual C++ Redistributable Package 更新版官网下载地址
    centos长ping输出日志的脚本
    Centos 常用命令
    c#连接数据库
    C#窗体间的跳转传值
    c#邮件发送
    C#WIFI搜索与连接
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/12995152.html
Copyright © 2011-2022 走看看