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

news2024/9/17 7:19:41

文章目录

    • 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_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;这样,在对变量进行重新赋值以后,在整个项目中才能起到类似于全局变量的作用;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM框架介绍

SSM通常指的是三个开源框架的组合,即Spring、SpringMVC(Spring Web MVC)和MyBatis,这三个框架经常一起使用来开发Java企业级应用,特别是在Web应用开发中非常流行。 SSM框架介绍 Spring 简介:Spring是一个…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行: mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法: mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题! 官方文档查漏补缺

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999,重装载值为2000,因为设置内部时钟晶振频率为100MHZ ,1s跳 100 000000次 ,跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…

九,自定义转换器详细操作(附+详细源码解析)

九,自定义转换器详细操作(附详细源码解析) 文章目录 九,自定义转换器详细操作(附详细源码解析)1. 基本介绍2. 准备工作3. 自定义转换器操作4. 自定义转换器的注意事项和细节5. 总结:6. 最后&…

【前端学习】AntV G6-07 深入图形与图形分组、自定义节点、节点动画(上、中)

课程链接 AntV G6:深入图形与图形分组、自定义节点、节点动画(上)_哔哩哔哩_bilibili AntV G6:深入图形与图形分组、自定义节点、节点动画(中)_哔哩哔哩_bilibili 图形分组 Group | G6 (antgroup.com) 自…

ARM32开发——DMA内存到内存

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

封装智能指针 qt实现登录界面

1.封装独占智能指针——unique_ptr #include <iostream> #include <utility> // For std::move// 命名空间 namespace custom_memory { template <typename T> class myPtr { public:// 使用初始化列表进行初始化explicit myPtr(T* p nullptr) noexcept : …

卡西莫多的诗文集2022-2024.9月6-校庆国庆专版定版

通过网盘分享的文件&#xff1a;卡西莫多的诗文集2022-2024.9月6-A5-校庆国庆专版-定版.pdf 链接: https://pan.baidu.com/s/1cpFK5k1baGXbSGxY30GL_A?pwdjgnt 提取码: jgnt 卡西莫多的诗文集2022-2024.9月6-校庆国庆专版&#xff0c;又稍作修改并勘误了一些错字&#xff0c;…

AWQ量化(Activation-aware Weight Quantization)

论文&#xff1a; AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration 中文解读&#xff1a; 深入理解AWQ量化技术 - 知乎 (zhihu.com) 动机&#xff1a;端侧设备用LLM&#xff0c;为了减少显存占用量&#xff0c;所以要用INT4量化&am…

【Jupyter Notebook】汉化

1.打开:Anaconda Prompt 2.输入:"activate Zhui01"(注意&#xff1a;Zhui01是刚创建的环境名字) activate Zhui01 3.输入:"pip install jupyterlab-language-pack-zh-CN" pip install jupyterlab-language-pack-zh-CN 4.打开:Jupyter Notebook 5.点击&q…

Mysql高级篇(中)——七种常见的 join 查询图

注意&#xff1a; MySQL是不支持 FULL OUTER JOIN 这种语法的&#xff0c;因此要实现图中 6、7的查询结果&#xff0c;可以使用 UNION 关键字结合 LEFT JOIN、RIGHT JOIN 实现&#xff0c;UNION可以实现去重的效果&#xff1b; 参考如下代码&#xff1a; -- MySQL中 图标6 的实…

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物&#xff0c;今天我们实现一下人物实现移动和跳起&#xff0c;依次点击&#xff0c;我们准备创建一个C#文件 创建好我们点击进去&#xff0c;就会跳转到我们的Vision Studio&#xff0c;然后输入这些代码 using UnityEngine;public class M…

MarginNote 4 激活码 - 苹果电脑(Mac)全能型的阅读工具

对广大求学者来说&#xff0c;如何科学有效地掌握知识&#xff0c;一定是大家不懈追求的方向。 众多求学者使用的&#xff0c;深度阅读学习工具 MarginNote&#xff0c;终于为 Mac 推出了官网 4.0 版。带来了众多创新的学习辅助工具。 MarginNote 4 功能简介 1、快速理清各版…

大数据新视界--大数据大厂之Java 与大数据携手:打造高效实时日志分析系统的奥秘

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

探索fastFM:Python中的高效推荐系统库

文章目录 &#x1f680; 探索fastFM&#xff1a;Python中的高效推荐系统库背景&#xff1a;为何选择fastFM&#xff1f;快照&#xff1a;fastFM是什么&#xff1f;安装指南&#xff1a;如何将fastFM加入你的项目&#xff1f;快速入门&#xff1a;五个基础函数的使用实战演练&am…

猫眼电影字体破解(图片转码方法)

问题 随便拿一篇电影做样例。我们发现猫眼的页面数据在预览窗口中全是小方框。在当我们拿到源码以后&#xff0c;数据全是加密后的。所以我们需要想办法破解加密&#xff0c;拿到数据。 破解过程 1.源码获取问题与破解 分析 在我们刚刚请求url的时候是可以得到数据的&#xff…

halcon 由离散点云生成3d模型(2步)

一&#xff0c;创建立方体的3d坐标&#xff0c;定义X,Y,Z坐标 dev_open_window (0, 0, 512, 512, black, WindowHandle) x:[0,0,1,1,0,0,1,1] y:[0,1,1,0,0,1,1,0] z:[0,0,0,0,2,2,2,2] 二&#xff0c;由3创建3d模型&#xff08;在这里是将所有的点集合为一体&#xff09; ge…

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds 总结 fd_set操作接口 timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充 获取新连接 注意点 -- 通信时的调用函数 添…

JavaScript使用高德API显示地图

前言 在JavaScript中&#xff0c;使用Leaflet库显示地图是一种常见的做法。Leaflet是一个开源的JavaScript库&#xff0c;用于在Web应用程序中创建互动地图。它非常轻量级&#xff0c;易于使用&#xff0c;并且提供了多种功能&#xff0c;使开发者能够轻松地将地图集成到他们的…