• Python语法: global变量的调用、改写与nonlocal关键字


    1. import aaa; aaa.T = new_value 方式改写全局变量

    aaa:

    T = 20
    
    def test():
        print("模块aaa的函数:print T = {}; id(T)= {}".format(T, id(T)))
    

    bbb:

    import aaa
    
    print("aaa模块中的全局变量 T = {}; id(T)= {}".format(aaa.T, id(aaa.T)))
    
    aaa.T = 5
    print("bbb中改写全局变量 T = {}; id(T)= {}".format(aaa.T, id(aaa.T)))
    
    aaa.test()
    

    可见,在bbb中改写 aaa.T 时,变换了T对象的实体。

    2. from aaa import T 载入全局变量

    如果bbb中调用T的方式改一下呢:

    import aaa
    from aaa import T
    
    print("aaa模块中的全局变量 T = {}; id(T)= {}".format(T, id(T)))
    
    T = 5
    print("bbb中改写全局变量 T = {}; id(T)= {}".format(T, id(T)))
    
    aaa.test()
    

    则并不会重写T对象!

    3. 命名空间

    注意:不同的import方式,会导致module中的内容的命名空间不同~

    • from module_A import X 会将该模块的函数/变量导入到当前模块的命名空间中,无须用module_A.X访问了。
    • import module_A modules_A本身被导入,但保存它原有的命名空间,故得用module_A.X方式访问其函数或变量。

    4. nonlocal 关键字

    向闭包函数传递外部的局部变量,使用 nonlocal name 在inner() 中声明name对象。

    global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。

    global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误。

    def TLV_header(self, body_size):
        TLV_format = "!"
    
        def setTLV(tag: str, int_type: str, value: int):
            nonlocal TLV_format
    
            unit_format = "Bc" + len_type
            TLV_format += unit_format
    
  • 相关阅读:
    虚拟化技术一些概念整理
    更改KVM虚拟机root的密码
    文件作为块设备访问
    KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程
    KVM虚拟机IO处理过程(一) ----Guest VM I/O 处理过程
    KVM的初始化过程
    linux删除文件未释放空间问题处理
    cgroup测试存储设备IOPS分配
    数组中的逆序对
    VMware Tools安装方法及解决无法全屏显示问题
  • 原文地址:https://www.cnblogs.com/brt2/p/13152203.html
Copyright © 2020-2023  润新知