ZetCode

Python globals 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 globals 函数,该函数返回一个字典,表示当前的全局符号表。我们将介绍命名空间检查、变量修改和实际用例。

基本定义

globals 函数返回当前全局符号表的字典。此字典包含当前作用域中所有可访问的全局变量、函数和类。

主要特征:返回一个实时字典,反映全局命名空间的更改。直接修改此字典会影响全局命名空间。它对于动态变量访问和元编程很有用。

基本用法

这是一个简单的用法,展示了 globals 如何访问全局变量和函数。 这演示了基本的字典接口。

basic_globals.py
x = 10
y = 20

def greet():
    return "Hello"

print(globals()["x"])       # 10
print(globals()["y"])       # 20
print(globals()["greet"]()) # "Hello"

此示例演示了如何通过 globals 字典访问全局变量和函数。 字典键是与变量/函数名称匹配的字符串。

请注意,在通过 globals 字典访问函数后,必须正常调用它们。 该字典提供对对象的直接访问。

动态变量创建

globals 字典可用于动态创建变量。 此示例演示了如何在运行时添加新的全局变量。

dynamic_vars.py
for i in range(1, 4):
    globals()[f"var_{i}"] = i * 10

print(var_1)  # 10
print(var_2)  # 20
print(var_3)  # 30

这使用字符串格式化和字典赋值创建三个新的全局变量(var_1、var_2、var_3)。 这些变量立即在全局命名空间中可用。

虽然功能强大,但应谨慎使用此技术,因为它与显式变量声明相比,会使代码更难理解和维护。

检查全局命名空间

globals 可用于检查全局命名空间中的内容。 此示例仅过滤和显示用户定义的全局变量。

inspect_globals.py
import math

PI = 3.14159
APP_NAME = "MyApp"

def show_user_globals():
    for name, value in globals().items():
        if not name.startswith('__') and not callable(value) and not isinstance(value, type):
            print(f"{name}: {value}")

show_user_globals()

此函数过滤掉 Python 内置函数(以 __ 开头)、函数和类,仅显示用户定义的变量。 输出将显示 PI 和 APP_NAME,但不显示 math 或内置函数。

此技术对于调试或当您需要在开发期间分析全局命名空间中可用的内容时很有用。

修改全局变量

globals 字典可以修改现有的全局变量。 此示例展示了如何在避免常见陷阱的同时安全地更新全局变量。

modify_globals.py
counter = 0

def increment_counter():
    globals()["counter"] += 1

def reset_counter():
    if "counter" in globals():
        globals()["counter"] = 0

increment_counter()
increment_counter()
print(counter)  # 2

reset_counter()
print(counter)  # 0

这演示了两个安全地修改全局计数器变量的函数。 increment_counter 函数增加计数器,而 reset_counter 将其设置回零。

使用 globals 进行修改是 global 关键字的替代方法,但应谨慎使用以保持代码清晰度。

动态函数调用

globals 允许按名称动态调用函数。 此示例演示了如何根据字符串输入或配置调用函数。

dynamic_calls.py
def start():
    print("Starting...")

def stop():
    print("Stopping...")

def restart():
    print("Restarting...")

def execute_command(command):
    if command in globals() and callable(globals()[command]):
        globals()[command]()
    else:
        print(f"Unknown command: {command}")

execute_command("start")    # Starting...
execute_command("stop")     # Stopping...
execute_command("reboot")   # Unknown command: reboot

此模式对于命令处理器或当您需要根据外部输入调用函数时很有用。 该代码检查名称是否存在于 globals 中并且是否可调用,然后再尝试执行它。

这种方法提供了灵活性,但需要仔细的输入验证,以避免处理不受信任的输入时出现安全问题。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程