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

为何函数中声明的全局对象k、p未出现在globals()中?

为什么标记为“k”和“p”的对象不是全局对象?

咱们拆解下你的代码执行逻辑,就能明白问题出在哪了:

首先得搞清楚global语句的本质——它只是告诉Python:「当我在函数内部给这些变量赋值时,别创建局部变量,直接操作全局命名空间里的对应变量」。但它本身不会主动在全局命名空间创建这些变量,变量真正成为全局变量的时机,是函数执行到赋值语句的时候。

看你代码的执行顺序:

  1. 先定义了全局变量my_global = 5,这时候它确实存在于全局命名空间中。
  2. 定义func1函数时,虽然声明了global my_global, k, p,但这只是个“操作规则预告”,此时k和p还完全没被创建出来。
  3. 紧接着你就执行print(k in all_gobals)——这时候func1根本没被调用过,k和p从来没被赋值过,全局命名空间里完全找不到这两个变量,所以直接访问k就触发了NameError。
  4. 只有当你调用func1()后,函数内部的k=10和p=15执行完毕,这两个变量才真正被添加到全局命名空间中。

如果调整代码顺序,先调用函数再检查,结果就符合预期了:

my_global = 5
def func1(n=5):
    global my_global, k, p
    k = 10
    p = 15
    return my_global + n + k + p

all_gobals = globals()
print(func1())  # 先执行函数,创建全局的k和p
print(k in all_gobals)  # 现在会输出True

总结几个核心点:

  • global是赋值导向标记,不是变量定义语句,不会自动生成全局变量。
  • 全局变量的创建必须依赖实际的赋值操作,而这个操作只有在函数被执行时才会发生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:25:18