为何函数中声明的全局对象k、p未出现在globals()中?
为什么标记为“k”和“p”的对象不是全局对象?
咱们拆解下你的代码执行逻辑,就能明白问题出在哪了:
首先得搞清楚global语句的本质——它只是告诉Python:「当我在函数内部给这些变量赋值时,别创建局部变量,直接操作全局命名空间里的对应变量」。但它本身不会主动在全局命名空间创建这些变量,变量真正成为全局变量的时机,是函数执行到赋值语句的时候。
看你代码的执行顺序:
- 先定义了全局变量
my_global = 5,这时候它确实存在于全局命名空间中。 - 定义
func1函数时,虽然声明了global my_global, k, p,但这只是个“操作规则预告”,此时k和p还完全没被创建出来。 - 紧接着你就执行
print(k in all_gobals)——这时候func1根本没被调用过,k和p从来没被赋值过,全局命名空间里完全找不到这两个变量,所以直接访问k就触发了NameError。 - 只有当你调用
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
相关产品推荐
相关产品推荐

