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

2024-09-09 18:04

本文主要是介绍python: 多模块(.py)中全局变量的导入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

global关键字

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

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

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

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

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

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

    • 创建一个可变类型数据时,每次创建一个新的对象时,Python 会为其分配一个新的内存地址,即使这些对象的初始值相同
    • 当修改变量指向对象的内容时,内存地址不会发生改变;
    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_listglobal_variable += 1global_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_variableif __name__ == '__main__':modify_variable()print(global_variable)  # 输出:20print(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 module1def 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_variableif __name__ == '__main__':modify_variable()print(global_variable)  # 输出:21print(global_variable_list)  # 输出:[1, 2, 3, 4] 

总结

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

这篇关于python: 多模块(.py)中全局变量的导入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1151880

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数