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_counter
    global_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_value
                print(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 = None
    def __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.mfbz.cn/a/559595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue+Mysql的广场舞团管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

牛客小白月赛91

A.Bingbong的化学世界 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 &#x1f319;“上…

AndroidStudio右下角显示内存使用情况

目录 一.具体效果 二.4.0以下版本 三.4.0以上版本 四.增加内存配置 一.具体效果 二.4.0以下版本 1.打开 Android Studio. 2.进入设置界面。点击 Android Studio 左上角的“File”&#xff0c;然后选择“Settings” 3.在设置界面中&#xff0c;选择“Appearance & Beha…

关于图像YUV格式分类和排布方式的全学习

【学习笔记】关于图像YUV格式分类和排布方式的全学习_yuv图像-CSDN博客 下图是将多个yuv420p图像(A和B)&#xff0c;拼接成一个画面的思路 A大小:416*64 B大小:416*208 将A和B合并到一个416*416的尺寸上&#xff0c;代码如下 //整合char * ptd;ptd (char * ) malloc (416*41…

手把手教你实现 C 语言的函数多参默认值 「下」

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/ifnDcV7AKrh6eVihVK9l5A 本文上接《手把手教你实现 C 语言的函数多参默认值 上》&#xff0c;下文提及的一些概念来源于上文&#xff0c;为方便阅…

使用LLM-API开发应用-DataWhale笔记

调用API 先使用一个例子 from openai import OpenAI ​ client OpenAI(# This is the default and can be omittedapi_keyos.environ.get("OPENAI_API_KEY"), //这个在环境env中 ) ​ completion client.chat.completions.create(# 调用模型&#xff1a;ChatGPT-…

【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

为方便大家理解YOLO的原理&#xff0c;这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述&#xff0c;为后续大家学习YOLO作为铺垫。 1、模型所干的活 工作中&#xff0c;大家经常将 Word 文档 上传到某转换器&#xff0c;然后转换输出为PDF文档。目标检测中我…

单点登录实现:一次登录,到处运行

单点登录&#xff1a;一次登录&#xff0c;到处运行 举个场景&#xff0c;假设我们的系统被切割为N个部分&#xff1a;商城、论坛、直播、社交…… 如果用户每访问一个模块都要登录一次&#xff0c;那么用户将会疯掉&#xff0c; 为了优化用户体验&#xff0c;我们急需一套机制…

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

23-代码随想录第202题快乐数

202. 快乐数 简单 相关标签 相关企业 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈&#xff0c;马斯克点赞&#xff0c;英伟达高级科学家Jim Fan直言&#xff0c;Llama 3将成为AI大模型发展历程的“分水岭”&#xff0c;AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日&#xff0c;AI圈再迎重磅消息&a…

一例Mozi僵尸网络的挖矿蠕虫分析(workminer)

概述 这是一个Linux平台的挖矿蠕虫&#xff0c;使用了go和C混合编译而成&#xff0c;主要通过爆破SSH口令进行传播&#xff0c;属于Mozi僵尸网络。其中GO代码负责SSH相关的爆破传播&#xff0c;以及对Config的处理&#xff0c;C代码则负责处理加入Mozi P2P网络&#xff0c;拉取…

【游戏专区】贪吃蛇

1&#xff0c;游戏背景 贪吃蛇&#xff08;Snake&#xff09;是一款经典的电子游戏&#xff0c;最初在1976年由 Gremlin 公司开发。它的游戏背景相对简单&#xff0c;但具有高度的成瘾性。 1. **游戏场景**&#xff1a;通常在一个有界的矩形区域内进行&#xff0c;可以是一个…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…

【Gradio】Could not create share link

【Gradio】Could not create share link 写在最前面在服务器端一直运行一个Python脚本解决&#xff1a;下载frpc_linux_amd64文件&#xff0c;并添加权限原理 完整过程&#xff1a;先找gradio库位置&#xff0c;然后发现缺失文件1. 打开终端2. 使用 find 命令查找 gradio 目录3…

Codigger GT模块:GUI融合Terminal,重塑开发体验

在信息技术日新月异的今天&#xff0c;开发者与计算机系统进行交互的界面&#xff0c;其体验的优化与升级显得尤为关键。Codigger G&T正是应这一需求而生&#xff0c;它巧妙地将现代图形用户界面&#xff08;GUI&#xff09;的优势融入传统的Terminal中&#xff0c;为开发者…

基于Java SpringBoot+Vue的体育用品库存管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…
最新文章