Python多文件全局变量工作机制、内存位置及类型差异疑问
Python全局变量的工作机制与内存位置解析
一、全局变量的工作逻辑
Python的全局变量是定义在模块级别的变量,当模块第一次被导入时,会创建专属的模块命名空间,全局变量就存储在这个命名空间中。其他模块通过import语句获取的,是这个命名空间里变量的引用。
二、内存存储位置
别被传统栈/堆概念误导——Python里所有对象(不管是列表、布尔值还是其他类型)都存在堆内存中,栈里只保存指向这些堆对象的引用(指针)。模块的全局命名空间本身也是一个字典对象,同样存放在堆上,全局变量的引用就保存在这个字典里。
三、两个示例的差异原因
1. 列表(可变类型)的情况
z1.py中a = [123],这里的a是指向堆上列表对象的引用:
- z3.py通过
from z1 import a拿到了同一个列表对象的引用,执行a[0] = 234是直接修改了堆上的列表对象本身(列表是可变类型,允许原地修改),并没有改变a的引用指向。 - 之后导入z2.py,z2里的
a同样指向这个已经被修改的列表对象,所以打印结果会是[234]。
2. 布尔值(不可变类型)的情况
z1.py中a = True,True是不可变对象:
- z3.py通过
from z1 import a拿到了True对象的引用;执行a = False时,是让z3.py本地的a引用指向了新的False对象,完全没有改动z1模块命名空间里的a引用。 - 导入z2.py时,z2从z1拿到的还是原来指向
True的引用,所以打印结果全是True。
核心结论:差异本质是可变类型和不可变类型的操作特性不同——可变类型的修改是在原对象上操作,会影响所有指向该对象的引用;不可变类型的赋值是创建新对象并切换本地引用,不会影响模块全局命名空间里的原始变量。
内容的提问来源于stack exchange,提问作者seungmin Lee
相关产品推荐
相关产品推荐

