Python中使用global关键字声明变量时的底层执行逻辑是什么?
Python
global 关键字底层原理解析 核心结论
global 是编译期生效的声明,不是运行到对应代码行才触发操作,它的作用是告诉Python解释器:当前函数内所有对该变量的读写,都直接操作全局命名空间的变量,不创建局部变量。
具体底层执行步骤
1. 函数定义编译阶段
Python解析器处理函数定义时,会预先扫描整个函数体的所有变量标识:
- 扫描到
global x声明后,会在当前函数的代码对象(code object)的标记位中,将x标记为全局变量 - 不会把
x加入当前函数的局部变量表(code object.co_varnames),后续所有对x的操作都会绕过局部命名空间
2. 函数运行阶段
所有对 global 声明变量的操作,都会直接指向当前模块的全局命名空间(即模块的 __dict__ 属性):
- 读操作:直接从全局命名空间查找键,找不到就抛出
NameError - 写操作:直接给全局命名空间的对应键赋值,不存在就新增键值对
对应示例的逻辑解释
报错示例的底层逻辑
def function(): global x print(x) function() print(x)
global x 只是告诉解释器函数内的 x 用全局的,但全程没有任何地方给全局命名空间的 x 赋值,全局命名空间里从来不存在 x 这个键,所以不管是函数内还是外部的 print(x) 查找都会失败,抛出 NameError。
正常运行示例的底层逻辑
def function(): global x x = 2 print(x) function() print(x)
函数运行到 x = 2 时,因为 x 已经被标记为全局变量,所以直接给全局命名空间新增了 x:2 的键值对,后续无论是函数内还是外部的读操作都能找到这个值,所以两次打印都输出2。
注意点
global声明的作用范围是整个函数,哪怕你把声明写在函数中间,声明之前用到的同名变量也会被判定为全局变量,不会当做局部变量处理- 没有
global声明时,函数内对变量的赋值默认会创建局部变量,读操作才会按照「局部→全局→内置」的顺序查找
内容的提问来源于stack exchange,提问作者ariaman5
相关产品推荐
相关产品推荐

