导语: 变量之所以叫“变量”,核心就是它的值可以改变!但改变值的时候,内存里发生了什么?今天带你看清:多次赋值后,变量名如何“搬家”到新空间,以及旧值去哪了?
一、现象观察:多次赋值,覆盖旧值
- 核心代码演示:
name = '玛利亚' # 第一次赋值:name指向存放'玛利亚'的空间
name = '楚留香' # 第二次赋值:name指向存放'楚留香'的新空间
print(name) # 输出:楚留香
- 关键发现: 无论赋值多少次,最后赋的值生效。上例中,print(name) 输出的是第二次赋值的 '楚留香','玛利亚' 仿佛“消失”了。
二、内存揭秘:变量名“搬家”,指向新空间
- 核心原理: 当给变量多次赋值时:
- 首次赋值 name = '玛利亚':在内存中开辟空间存放 '玛利亚',变量名 name 指向(引用)这个空间。
- 再次赋值 name = '楚留香':不是修改原空间的值! 而是在内存中开辟新空间存放 '楚留香',然后让变量名 name 断开与原空间的连接,重新指向这个新空间。
- 结果: name 这个“标签”从此贴在了装有 '楚留香' 的新“盒子”上。访问 name 只能找到新值。
三、图解内存:从“玛利亚”到“楚留香”
想象内存中有两个“带标签的盒子”:
- 初始状态 (执行 name = '玛利亚' 后):
name -----> [ 内存地址ID1 | 类型:str | 值:'玛利亚' ]
name 标签牢牢贴在第一个盒子上。
- 再次赋值后 (执行 name = '楚留香' 后):
name [ 内存地址ID1 | 类型:str | 值:'玛利亚' ] <-- 无人指向,变“垃圾”
[ 内存地址ID2 | 类型:str | 值:'楚留香' ] <-- name 的新家!
- name 标签撕下,从第一个盒子移走。
- name 标签重新贴上第二个装有 '楚留香' 的盒子。
- 第一个装有 '玛利亚' 的盒子无人引用,成为“内存垃圾”。
四、旧值去哪了?Python的“清洁工”
- 核心问题: 被 name “抛弃”的 '玛利亚' 去哪了?
- 答案:自动回收! Python 内置强大的垃圾回收机制 (Garbage Collection)。它会自动检测那些没有变量名指向的内存空间(如存放 '玛利亚' 的空间),并将其回收释放,供后续程序使用。
- 程序员福音: 开发者无需手动释放内存,Python 自动处理,极大降低内存管理负担。
总结与关键点:
- 变量值可变是核心特性。
- 多次赋值 ≠ 修改原值:每次赋值 (=) 都可能导致变量名指向全新的内存空间。
- 变量名是“标签”:它指向哪个空间,访问时就取哪个空间的值(最后贴的那个)。
- 旧值命运:被变量名“抛弃”的值,若再无引用,会被 Python 垃圾回收机制自动清理。
一句话记住: 给变量赋新值?其实是让它的名字“搬家”去新空间!旧房子(内存空间)自有“清洁工”处理。