You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python模块访问导入它的环境中的全局变量?

如何让函数返回调用者的全局变量而非定义模块的全局变量?

问题出在globals()的行为上:它返回的是定义该函数的模块的全局命名空间,而不是调用函数时所在的命名空间。你的bar函数在foo模块里定义,所以bar()返回的是foo模块的全局变量,里面的x就是初始赋值的0,和终端里主模块(__main__)定义的x=1完全是两个不同的变量。

要实现你要的效果,也就是让bar返回调用者的全局变量,可以用Python的inspect模块获取调用栈的上下文:

修改foo.py如下:

import inspect

x = 0
def bar():
    # 获取调用bar的上层帧,取出其全局命名空间
    caller_frame = inspect.currentframe().f_back
    return caller_frame.f_globals

之后在终端执行你的代码:

from foo import bar
x=1
bar()["x"]  # 此时返回1,符合预期

补充说明

  • inspect.currentframe()会获取当前bar函数执行时的栈帧,f_back属性指向调用bar的那个栈帧(也就是终端里的代码上下文)
  • 每个栈帧的f_globals属性就是该上下文的全局命名空间字典

如果你想保留灵活性,也可以让调用者手动传入全局命名空间(可选):

# foo.py
import inspect

x = 0
def bar(caller_globals=None):
    if caller_globals is None:
        caller_frame = inspect.currentframe().f_back
        caller_globals = caller_frame.f_globals
    return caller_globals

这样调用时既可以用bar()自动获取,也可以手动传bar(globals()),效果一致。

内容的提问来源于stack exchange,提问作者Thomas Winckelman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:10:02