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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:23