Python-VBA函数之旅-globals函数

目录

一、globals函数的常见应用场景:

二、globals函数与locals函数对比分析:

1、globals函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421 



一、globals函数的常见应用场景:

        globals函数在Python中主要用于获取当前模块的全局符号表,它在实际编程中有多种应用场景。常见的应用场景有: 

1、调试和诊断:在调试代码时,globals()函数可以用来检查全局变量的状态。通过查看全局符号表,你可以了解哪些全局变量已经被定义,以及它们的当前值,这有助于诊断变量未定义或值不正确的问题。

2、动态代码执行:如果你需要根据运行时条件动态地执行代码,globals()函数可以与exec()或eval()函数一起使用。例如,你可以从字符串中构建代码,并使用exec()函数在当前的全局环境中执行它,这可以用于实现一些高级功能,但需要谨慎使用,以避免安全风险和代码可维护性问题。

3、插件系统和扩展:在构建插件系统或可扩展应用时,globals()函数可以用于注册或检索插件提供的函数或类。插件可以将其组件添加到全局符号表中,以便主程序或其他插件可以访问它们,然而,这种做法通常不如使用明确的注册机制或依赖注入框架来得清晰和安全。

4、构建交互式环境:在构建交互式解释器、代码编辑器或其他需要动态解析和执行代码的工具时,globals()函数可以用来管理当前上下文的全局变量,这允许用户定义自己的变量和函数,并在后续的交互中使用它们。

5、高级元编程:对于进行元编程或编写框架的开发者来说,globals()函数可以用来检查和操作代码的结构。例如,框架可能需要在运行时检查全局变量以确定可用的配置选项或插件。

6、实现单例模式:在某些设计模式中,如单例模式,全局变量用于确保一个类只有一个实例。通过globals()函数可以方便地访问和修改这些全局变量,从而控制实例的创建和访问。

        注意,虽然globals()函数提供了强大的功能,但过度依赖它可能会导致代码难以理解和维护。在大多数情况下,更好的做法是使用局部变量、参数传递、类或模块级别的变量来管理状态和数据流,使用globals()函数时应该谨慎,并确保理解其潜在的影响和副作用。

二、globals函数与locals函数对比分析:

        globals()和locals()是Python中的两个内置函数,它们分别用于获取当前全局和局部符号表。这两个函数在Python编程中扮演着重要的角色,尤其在理解变量作用域和调试过程中。下面我们将对这两个函数进行对比分析:

1、作用域:globals()函数返回的是全局作用域中的变量,而locals()函数返回的是当前局部作用域中的变量。全局作用域通常是整个程序,而局部作用域则是函数或方法内部。
2、使用场景:globals()函数在需要访问或修改全局变量时很有用,而locals()函数在调试或理解函数内部变量时很有用。
3、可变性:尽管globals()函数和locals()函数返回的字典在大多数情况下是可变的,但直接修改这些字典可能会导致不可预测的行为。通常,我们不建议直接修改这些字典。
4、性能:由于globals()函数和locals()函数需要遍历作用域中的变量,因此在性能敏感的场景中,频繁调用这些函数可能会导致性能下降。
5、嵌套作用域:在嵌套的作用域中(例如在一个函数内部定义另一个函数),内部函数的locals()函数将包含其自己的局部变量,而globals()函数将始终返回最外层的全局作用域。

1、globals函数:
1-1、Python:
# 1.函数:globals
# 2.功能:用于返回表示当前全局符号表的字典,即获取当前全局符号表的字典
# 3.语法:globals()
# 4.参数:无
# 5.返回值:返回表示当前全局符号表的字典
# 6.说明:
# 7.示例:
# 应用1:调试和诊断
# 查看全局变量
# 定义一些全局变量
global_var1 = "Hello"
global_var2 = 18
global_var3 = [3, 5, 6]
def print_globals():# 打印所有全局变量for name, value in globals().items():print(f"Name: {name}, Value: {value}")
# 调用函数打印全局变量
print_globals()
# Name: __name__, Value: __main__
# Name: __doc__, Value: None
# Name: __package__, Value: None
# Name: __loader__, Value: <_frozen_importlib_external.SourceFileLoader object at 0x000002B0ACC6CE90>
# Name: __spec__, Value: None
# Name: __annotations__, Value: {}
# Name: __builtins__, Value: <module 'builtins' (built-in)>
# Name: __file__, Value: E:\python_workspace\pythonProject\test1.py
# Name: __cached__, Value: None
# Name: print_globals, Value: <function print_globals at 0x000002B0ACC10540># 检查特定全局变量是否存在
global_var1 = "Hello"
global_var2 = 18
def check_global_var(var_name):# 检查全局变量是否存在if var_name in globals():print(f"The global variable '{var_name}' exists with value: {globals()[var_name]}")else:print(f"The global variable '{var_name}' does not exist.")
# 检查全局变量
check_global_var('global_var1')  # 应该存在
check_global_var('global_var3')  # 应该不存在
# The global variable 'global_var1' exists with value: Hello
# The global variable 'global_var3' does not exist.# 在函数内部修改全局变量并验证修改
global_counter = 0
def increment_counter():# 使用global关键字声明我们要修改的是全局变量global global_counterglobal_counter += 1
def print_counter():# 打印全局计数器的值print(f"Global counter: {global_counter}")
# 调用函数增加计数器的值并打印
increment_counter()
print_counter()  # 应该输出 1
increment_counter()
print_counter()  # 应该输出 2
# Global counter: 1
# Global counter: 2# 调试时查看函数调用栈中的全局变量
import inspect
def print_global_vars_in_stack():# 获取当前堆栈帧信息stack = inspect.stack()# 遍历堆栈帧,打印每个帧的全局变量for frame in stack:print(f"Frame {frame[2]} in {frame[1]} at line {frame[3]}")for name, value in frame[0].f_globals.items():print(f"  Name: {name}, Value: {value}")print("---")
# 调用函数查看全局变量(包括调用栈中的)
print_global_vars_in_stack()
# Frame 4 in E:\python_workspace\pythonProject\test1.py at line print_global_vars_in_stack
#   Name: __name__, Value: __main__
#   Name: __doc__, Value: None
#   Name: __package__, Value: None
#   Name: __loader__, Value: <_frozen_importlib_external.SourceFileLoader object at 0x000002483ECACE90>
#   Name: __spec__, Value: None
#   Name: __annotations__, Value: {}
#   Name: __builtins__, Value: <module 'builtins' (built-in)>
#   Name: __file__, Value: E:\python_workspace\pythonProject\test1.py
#   Name: __cached__, Value: None
#   Name: inspect, Value: <module 'inspect' from 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\inspect.py'>
#   Name: print_global_vars_in_stack, Value: <function print_global_vars_in_stack at 0x000002483ED811C0>
# ---
# Frame 12 in E:\python_workspace\pythonProject\test1.py at line <module>
#   Name: __name__, Value: __main__
#   Name: __doc__, Value: None
#   Name: __package__, Value: None
#   Name: __loader__, Value: <_frozen_importlib_external.SourceFileLoader object at 0x000002483ECACE90>
#   Name: __spec__, Value: None
#   Name: __annotations__, Value: {}
#   Name: __builtins__, Value: <module 'builtins' (built-in)>
#   Name: __file__, Value: E:\python_workspace\pythonProject\test1.py
#   Name: __cached__, Value: None
#   Name: inspect, Value: <module 'inspect' from 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\inspect.py'>
#   Name: print_global_vars_in_stack, Value: <function print_global_vars_in_stack at 0x000002483ED811C0>
# ---# 应用2:动态代码执行
# 动态执行字符串形式的代码
def execute_code_string(code_string):# 使用exec函数动态执行代码字符串# 注意:exec函数可以执行任何Python代码,所以要小心使用exec(code_string, globals())
# 定义一些全局变量
global_var = "Initial value"
# 动态执行代码,修改全局变量的值
execute_code_string("global_var = 'New value from executed code'")
# 打印修改后的全局变量值
print(global_var)
# New value from executed code# 动态导入模块
import sys
module_name = input("请输入要导入的模块名: ")
__import__(module_name, globals(), locals())
# 现在你可以使用刚刚导入的模块中的函数和变量了
getattr(sys, 'modules')[module_name].some_function()# 动态执行代码
code_in_string = """
x = 10
y = 20
def add():return x + y
"""
exec(code_in_string, globals())
print(add())
# 30# 应用3:构建交互式环境
def interactive_environment():while True:try:# 获取用户输入user_input = input("请输入命令(输入'exit'退出): ")# 检查是否要退出if user_input.lower() == 'exit':print("退出交互式环境!")break# 检查是否是设置变量的命令elif '=' in user_input:# 解析变量名和值var_name, var_value = user_input.split('=', 1)var_value = eval(var_value)  # 注意:eval 可能会执行恶意代码,仅用于示例# 将变量添加到全局命名空间中globals()[var_name.strip()] = var_valueprint(f"变量 {var_name} 已设置为 {var_value}")# 检查是否是执行代码的命令elif user_input.startswith('exec '):# 执行用户输入的代码片段code_to_execute = user_input[5:].strip()exec(code_to_execute, globals())else:print("无效的命令,请输入变量赋值命令(如 x=5)或执行代码命令(如 exec print('Hello')).")except Exception as e:print(f"发生错误: {e}")
# 运行交互式环境
interactive_environment()
# 请输入命令(输入'exit'退出): x=5
# 变量 x 已设置为 5
# 请输入命令(输入'exit'退出): exit
# 退出交互式环境!# 应用4:实现单例模式
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instance
if __name__ == '__main__':instance1 = Singleton()instance2 = Singleton()print(instance1 is instance2)print(Singleton._instance is instance1)
# True
# True# 应用5:获取当前全局符号表的字典
print(globals())
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000284EC90CE90>,
# '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:\\python_workspace\\pythonProject\\globals函数.py', '__cached__': None}# 应用6:将函数内的变量添加到全局变量中
def test_1():globals()['val'] = 2024
test_1()
print(val)
# 2024# 应用7:禁用哈希随机化
import os
import sys
import hashlib
def disable_hash_randomization():# 设置环境变量PYTHONHASHSEED为0来禁用哈希随机化  os.environ['PYTHONHASHSEED'] = '0'print("Hash randomization has been disabled.")
def enable_hash_randomization():# 清除环境变量PYTHONHASHSEED来启用哈希随机化(如果之前被设置的话)  if 'PYTHONHASHSEED' in os.environ:del os.environ['PYTHONHASHSEED']print("Hash randomization has been enabled.")
def calculate_hash(obj):# 计算对象的哈希值  return hash(obj)
if __name__ == '__main__':# 在脚本开始时禁用哈希随机化  disable_hash_randomization()# 计算一些哈希值  hash1 = calculate_hash("hello")hash2 = calculate_hash("Python")print(f"Hash of 'hello': {hash1}")print(f"Hash of 'world': {hash2}")# 可以选择性地重新启用哈希随机化  enable_hash_randomization()# 注意:一旦Python解释器启动,改变PYTHONHASHSEED通常不会影响已经计算过的哈希值  # 如果你需要在解释器运行过程中改变哈希行为,你可能需要重新启动解释器。
# Hash randomization has been disabled.
# Hash of 'hello': -9019399724072782803
# Hash of 'world': -7486668747021156726
# Hash randomization has been enabled.
1-2、VBA:
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-bytes()函数 

2-2、Python-VBA函数之旅-callable()函数

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421 

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

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

相关文章

Python的round与Excel的round不一样?

Python四舍五入怎么做 round()奇进偶舍round函数既不是“四舍五入”的原则&#xff0c;也不是“四舍六入无成双”的原则。 decimal round() 偶然发现python的round函数和excel的round函数对某些数据的处理结果不一致。有看到博主提到是奇进偶舍的方法&#xff0c;但经过验证和…

49-PCIE转网口电路设计

视频链接 PCIE转网口电路设计01_哔哩哔哩_bilibili PCIe转网口电路设计 1、PCIE转网口电路设计基本介绍 pcie转网口的设计&#xff0c;一般有intel (i350)和网讯&#xff08;wx1860&#xff09;两种方案。 2、PCIE转网口的方案 2.1、I350 2.2、WX1860 (网迅) 国产化&#…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口&#xff1a; 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

BYOL(NeurIPS 2020)原理解读

paper&#xff1a;Bootstrap your own latent: A new approach to self-supervised Learning third-party implementation&#xff1a;https://github.com/open-mmlab/mmpretrain/blob/main/mmpretrain/models/selfsup/byol.py 本文的创新点 本文提出了一种新的自监督学习方…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法&#xff0c; uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理&#xff0c; 通过接口获取数据&#xff0c;根据用户选择当前列选项设置子列数据&#xff0c;实现三级联动效果&#xff0c; 本示例中处…

SEW减速机参数查询 2-2 实践

首先说说结论&#xff1a;在不和SEW官方取得沟通之前&#xff0c;你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数&#xff1a;比如轴的模数和齿数&#xff0c;轴承的参数。我在周一耗费了一个上午&#xff0c;最终和SEW方面确认后才知晓相关技术参数需要凭借销…

Jenkins的安装和部署

文章目录 概述Jenkins部署项目的流程jenkins的安装启动创建容器进入容器浏览器访问8085端口 Jenkins创建项目创建example项目 概述 Jenkins&#xff1a;是一个开源的、提供友好操作界面的持续集成&#xff08;CLI&#xff09;工具&#xff0c;主要用于持续、自动构建的一些定时…

什么是Rust语言?探索安全系统编程的未来

&#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来 文章目录 &#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来摘要引言正文&#x1f4d8; Rust语言简介&#x1f31f; 发展历程&#x1f3af; Rust的技术意义和优势&#x1f4e6; Rust解决的问题…

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

deepinV23 Beta3安装cuda

文章目录 下载CUDA安装,以cuda11.6为例运行.run文件安装选项配置环境变量查看cuda版本重启计算机 卸载cuda deepinV23 Beta3对应的debian版本是12&#xff1a; bookworm指的是debian12&#xff0c; sid代表不稳定版。 下载CUDA 官网&#xff1a;https://developer.nvidia.com…

中华环保联合会获得国家“绿色制造体系” 第三方评价机构资格

近日&#xff0c;中华环保联合会成功获得工业和信息化部“绿色制造体系”第三方评价机构资格&#xff0c;可为企业、园区及相关机构提供全面的绿色制造体系评价服务&#xff0c;包括绿色工厂、绿色园区、绿色供应链等方面。 “绿色制造体系建设”是由工业和信息化部负责统筹推进…

redis异常:OOM command not allowed when used memory > ‘maxmemory‘

redis存储数据太多,内存溢出,导致异常 1.查看redis内存使用情况 登录redis后 info memory2.查看分配给redis的最大内存 config get maxmemory3.处理方式:拓展redis的最大内存 打开redis.conf文件,修改maxmemory 4.删掉键值重启redis后,发现删掉的数据又恢复了? redis根目录…

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮&#xff0c;随后谷歌推出了自己的AI聊天机器人Bard&#xff0c;紧接着微软推出了Bing Chat&#xff0c;百度也推出了文心一言&#xff0c;这些聊天机器人的推出&#xff0c;标志着对话式AI技术已经达到了一个…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

7.2 跳跃表(skiplist)

文章目录 前言一、跳跃表——查找操作二、跳跃表——插入操作三、代码演示3.1 输出结果3.2 代码细节 四、总结&#xff1a;参考文献&#xff1a; 前言 本章内容参考海贼宝藏胡船长的数据结构与算法中的第七章——查找算法&#xff0c;侵权删。 查找的时间复杂度能从原来链表的…

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

CSS动画(css、js动画库:各种动画效果)

第一种方法&#xff1a;文字从上到下显示动画&#xff1b; <div class"text-container"><div class"text">文字从上到下显示</div></div><style scoped> /*确保 keyframes 规则在引用它的任何选择器之前定义&#xff0c;以避…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

C语言数据结构之顺序表

目录 1.线性表2.顺序表2.1顺序表相关概念及结构2.2增删查改等接口的实现 3.数组相关例题 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性&#xff08;数据类型相同&#xff09;的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff…

2024年阿里云服务器明细报价整理总结

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…