zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    @loj
    @loj
    @划水记@ THUWC2020 (?)
    @codeforces
    @loj
    Spark设计理念与基本架构
    Spark源码解析
    Spark Submitting Applications浅析
    Spark RDD基本概念与基本用法
    Storm基本原理概念及基本使用
  • 原文地址:https://www.cnblogs.com/brt2/p/13152203.html
Copyright © 2011-2022 走看看