python: 多模块(.py)中全局变量的导入

文章目录

  • global关键字
  • 可变类型和不可变类型数据的内存地址
  • 单模块(单个py文件)的全局变量
  • 示例
  • 总结
  • 多模块(多个py文件)的全局变量
  • from x import x导入全局变量
  • 示例
  • import x导入全局变量
  • 示例
  • 总结
  • global关键字

    1. global 的作用范围是模块(.py)级别
    2. 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空间中存在,其他模块并不能直接访问它。
    3. globals() 函数返回当前全局命名空间的字典(每个模块都有自己独立的全局命名空间)
    4. 可以通过globals()函数动态新增或者删除全局变量
    5. globals().update("变量名":"变量值") # 类似于操控字典一样去新增,删减或者修改都可以
      

    可变类型和不可变类型数据的内存地址

    1. 不可变类型数据(数字类型数据[整型,浮点型],字符串,布尔值,元组,冻结集合frozenset)

    2. 创建一个不可变类型的对象时,Python 会为每个不同的值分配一个唯一的内存地址;(frozenset 对象例外,这是因为 Python 的 frozenset 类型不像一些其他不可变类型(如 int 或 str)那样在创建相同值的对象时进行缓存或重用。每次创建 frozenset 对象时,Python 都会分配一个新的内存地址。)

      a = "12"
      b = "12"
      print(id(a), id(b))  # 2063368331504 2063368331504
      print(a is b)  # True
      
    3. 当修改变量的指向对象时(对象内容不可修改,所以只能修改指向的对象,即重新赋值),变量的内存地址发生改变;

      a = "12"
      b = 12
      print(id(a), id(b))  # 3104829481200 3104828162640
      print(a is b)  # False
      
    4. 可变类型数据(字典,列表,集合)

    5. 创建一个可变类型数据时,每次创建一个新的对象时,Python 会为其分配一个新的内存地址,即使这些对象的初始值相同
    6. 当修改变量指向对象的内容时,内存地址不会发生改变;
    7. a = [1, 2, 3]
      b = [1, 2, 3]
      print(id(a), id(b))  # 2089263067200 2089267730752
      a.append(4)
      print(id(a), id(b))  # 2089263067200 2089267730752
      

    单模块(单个py文件)的全局变量

    单模块意味着代码只包含一个 Python 文件。在这种情况下,全局变量定义在模块的顶层,可以在模块内的任意地方访问和修改。

    示例

    # global_var.py
    global_variable = 10  # 定义全局变量
    global_variable_list = [1, 2, 3] 
    def modify_variable():
        global global_variable  # 声明使用全局变量
        global global_variable_list
        global_variable += 1
        global_variable_list.append(4)
        print(f"Modified global_variable: {global_variable}")
    
    modify_variable()  # 输出:Modified global_variable: 11
    print(global_variable)  # 输出:11
    print(global_variable_list)  # 输出:[1, 2, 3, 4] 
    

    总结

  • 全局变量可以在整个模块的任何函数或方法中被访问。
  • 使用 global 关键字声明某个变量是全局变量,以便函数内部对其进行修改。
  • 这种情况下,不管变量的对象是属于可变还是不可变,修改以后,全局都会做出相应的修改;
  • 多模块(多个py文件)的全局变量

    from x import x导入全局变量

    在多模块的场景下,可能有多个 .py 文件。这时,如果全局变量的对象类型为不可变数据类型时,最好不要使用from x import x来在其他模块中访问。 根本原因是不可变类型数据的内存地址是唯一的,如果在引用的py文件的全局作用域中对其引用的变量进行修改的话,相当于在当前模块的全局作用域中重新声明了一个拥有相同变量名,并指向新对象的变量(拥有新的内存地址) , 原本模块里面的值是不会受到影响的;甚至如果是在当前模块的函数里面直接修改的话,python解释器会直接错;

    示例

    假设有三个模块 module1.pymodule2.pymodule_main.py,其中 module1.py 中定义了全局变量。

  • module1.py
  • # module1.py
    global_variable = 20  # 定义全局变量
    global_variable_list = [1, 2, 3]
     
    
  • module2.py
  • # module2.py
    from module1 import global_variable ,global_variable_list # 导入 module1 模块
    
    global_variable += 1 # 这其实相当于在当前全局变量作用域重新声明了一个新的变量;
    
    def modify_variable():
    	# global_variable += 1 直接在函数内部修改其他模块的全局变量,代码会直接报错
        global_variable_list.append(4)
    
  • module_main.py
  • # module_main.py
    from module1 import global_variable ,global_variable_list # 导入 module1 模块
    from module2 import modify_variable
    
    if __name__ == '__main__':
    	modify_variable()
    	print(global_variable)  # 输出:20
    	print(global_variable_list)  # 输出:[1, 2, 3, 4] 
    	
    

    import x导入全局变量

    示例

    假设有三个模块 module1.pymodule2.pymodule_main.py,其中 module1.py 中定义了全局变量。

  • module1.py
  • # module1.py
    global_variable = 20  # 定义全局变量
    global_variable_list = [1, 2, 3]
     
    
  • module2.py
  • # module2.py
    import module1
    
    def modify_variable():
    	module1.global_variable += 1 
        module1.global_variable_list.append(4)
    
  • module_main.py
  • # module_main.py
    from module1 import global_variable ,global_variable_list # 导入 module1 模块
    from module2 import modify_variable
    
    if __name__ == '__main__':
    	modify_variable()
    	print(global_variable)  # 输出:21
    	print(global_variable_list)  # 输出:[1, 2, 3, 4] 
    	
    

    总结

  • 当全局变量为可变数据类型时使用from x import x或者import x都可以;
  • 当全局变量为不可变数据类型时,推荐使用import x;这样,在对变量进行重新赋值以后,在整个项目中才能起到类似于全局变量的作用;
  • 作者:衫水

    物联沃分享整理
    物联沃-IOTWORD物联网 » python: 多模块(.py)中全局变量的导入

    发表回复