python3 globals() 函数

python3 globals() 函数

globals().items() 是 Python 中一个非常有用的内置函数组合,用于获取当前全局命名空间中的所有变量和它们的值。

基本用法

# 定义一些全局变量
x = 10
y = "hello"
z = [1, 2, 3]

def my_func():
    return "I'm a function"

class MyClass:
    pass

# 查看全局命名空间
print("全局变量:")
for name, value in globals().items():
    print(f"{name}: {type(value).__name__}")

实际应用示例

示例1:查看所有内置函数和变量

# 查看所有以双下划线开头的内置属性
print("内置属性:")
for key, value in globals().items():
    if key.startswith('__'):
        print(f"{key}: {value}")
		

示例2:动态查找和操作变量

# 创建一些变量
var1 = 100
var2 = 200
var3 = 300

# 动态查找所有以'var'开头的变量
print("以'var'开头的变量:")
for name, value in globals().items():
    if name.startswith('var'):
        print(f"{name} = {value}")

示例3:调试时查看变量状态

def debug_function():
    local_var = "inside function"
    
    # 在函数内部查看全局变量
    print("函数内部的全局变量:")
    for name, value in globals().items():
        if not name.startswith('__') and not callable(value):
            print(f"  {name}: {value}")

debug_function()

示例4:动态创建和修改变量

# 动态创建变量
for i in range(5):
    globals()[f'dynamic_var_{i}'] = i * 10

# 查看动态创建的变量
print("动态创建的变量:")
for name, value in globals().items():
    if name.startswith('dynamic_var'):
        print(f"{name} = {value}")

# 动态修改变量
if 'dynamic_var_2' in globals():
    globals()['dynamic_var_2'] = 999
    print(f"修改后: dynamic_var_2 = {dynamic_var_2}")

示例5:清理特定变量

# 创建一些测试变量
temp1 = "to delete"
temp2 = "to keep"
important_var = "don't delete"

# 删除所有以'temp'开头的变量
to_delete = []
for name in globals().keys():
    if name.startswith('temp'):
        to_delete.append(name)

for name in to_delete:
    del globals()[name]

print("删除后剩余的变量:")
for name in globals().keys():
    if not name.startswith('__'):
        print(f"  {name}")

注意事项

  1. 与 locals() 的区别
def compare_globals_locals():
    local_var = "I'm local"
    global global_var
    global_var = "I'm global"
    
    print("locals():")
    for k, v in locals().items():
        print(f"  {k}: {v}")
    
    print("\nglobals() 中的函数相关变量:")
    for k, v in globals().items():
        if k in ['local_var', 'global_var', 'compare_globals_locals']:
            print(f"  {k}: {v}")

compare_globals_locals()

  1. 性能考虑
import time

# globals() 调用有一定开销,避免在循环中频繁调用
start = time.time()
for _ in range(10000):
    g = globals()
end = time.time()
print(f"调用10000次耗时: {end-start:.4f}秒")

  1. 安全警告
# 危险:不要接受用户输入直接操作 globals()
user_input = "__import__('os').system('rm -rf /')"  # 恶意代码

# 绝对不要这样做!
# exec(user_input, globals())  # 这会导致灾难性后果

实用技巧

技巧1:统计变量信息

def analyze_globals():
    """分析全局命名空间"""
    g = globals()
    
    stats = {
        'total': len(g),
        'variables': 0,
        'functions': 0,
        'classes': 0,
        'modules': 0,
        'builtins': 0
    }
    
    for name, value in g.items():
        if name.startswith('__'):
            stats['builtins'] += 1
        elif callable(value):
            if isinstance(value, type):
                stats['classes'] += 1
            else:
                stats['functions'] += 1
        elif hasattr(value, '__spec__'):  # 模块
            stats['modules'] += 1
        else:
            stats['variables'] += 1
    
    return stats

print("全局命名空间分析:")
for key, value in analyze_globals().items():
    print(f"  {key}: {value}")

技巧2:创建配置管理器

class ConfigManager:
    @classmethod
    def get_configs(cls, prefix='CONFIG_'):
        """获取所有以指定前缀开头的配置变量"""
        configs = {}
        for name, value in globals().items():
            if name.startswith(prefix):
                config_name = name[len(prefix):].lower()
                configs[config_name] = value
        return configs

# 定义配置
CONFIG_DATABASE = "localhost"
CONFIG_PORT = 3306
CONFIG_DEBUG = True

# 获取配置
configs = ConfigManager.get_configs('CONFIG_')
print("配置信息:", configs)

总结

globals().items() 是一个强大的工具,主要用于:

  • 调试:查看当前命名空间状态
  • 元编程:动态操作变量
  • 配置管理:收集配置信息
  • 清理工作:批量删除变量

重要提醒:

  • 谨慎使用,特别是在生产代码中
  • 避免接受外部输入操作 globals()
  • 理解其与 locals() 的区别
  • 注意性能影响,避免在关键循环中使用

https://www.jb51.net/python/344951d2c.htm

posted @ 2025-12-12 17:26  michaelchengjl  阅读(4)  评论(0)    收藏  举报