Python 中的栈区(Stack)和堆区(Heap)浅解

📅 2026/8/2 12:02:13
Python 中的栈区(Stack)和堆区(Heap)浅解
文章目录[TOC](文章目录)前言虽然 Python 底层依赖 C 语言的栈和堆但 Python 对开发者屏蔽了这些细节。不过理解这个概念对理解 Python 的内存管理和变量赋值非常有帮助。一、核心图解二、 详细解释1.栈区Stack2.堆区Heap3. 关键理解变量是贴在对象上的标签4.实战验证5. 可变与不可变对象的区别6.总结对比表记忆口诀前言虽然 Python 底层依赖 C 语言的栈和堆但 Python 对开发者屏蔽了这些细节。不过理解这个概念对理解 Python 的内存管理和变量赋值非常有帮助。一、核心图解二、 详细解释1.栈区Stack存放内容变量名和它们指向的引用地址也就是堆区对象的地址特点存储的是引用指针不是实际数据访问速度非常快直接访问大小固定由系统管理遵循 LIFO后进先出原则xm小明# 栈中存储变量名 xm指向堆中的字符串小明age18# 栈中存储变量名 age指向堆中的整数 18dog1Dog()# 栈中存储变量名 dog1指向堆中的 Dog 实例对象2.堆区Heap存放内容所有实际的对象数据字符串、数字、列表、实例等特点存储的是实际数据访问速度相对较慢需要间接寻址大小动态由 Python 的垃圾回收机制管理所有对象都在堆区创建# 堆中存储的实际数据name小明# 小明 这个字符串对象在堆中age18# 18 这个整数对象在堆中numbers[1,2]# [1, 2] 这个列表对象在堆中# 列表中存储的是对堆中 1 和 2 的引用3. 关键理解变量是贴在对象上的标签在 Python 中变量名实际上是一个贴在对象上的标签而不是存储对象的盒子。图解变量赋值a[1,2,3]# 创建列表对象贴上标签 aba# 把标签 b 也贴到同一个对象上4.实战验证classDog:def__init__(self,name):self.namename dog1Dog(旺财)dog2dog1# dog2 和 dog1 指向同一个堆区对象print(id(dog1))# 0x7f8a1c2d3e4f堆区地址print(id(dog2))# 0x7f8a1c2d3e4f完全相同# 验证它们指向同一个对象print(dog1isdog2)# True# 修改 dog1dog2 也跟着变因为指向同一个堆区对象dog1.name来福print(dog2.name)# 来福确实变了5. 可变与不可变对象的区别不可变对象int, str, tuple修改时会创建新对象重新绑定引用。a10# 栈中 a → 堆中地址 0xA0F0 (值10)a20# 栈中 a → 堆中地址 0xA1F1 (值20新创建)# 原来 0xA0F0 的 10 被垃圾回收了可变对象list, dict, 自定义对象修改时不会创建新对象直接修改堆中的数据。lst[1,2]# 栈中 lst → 堆中地址 0xB0F0lst.append(3)# 堆中地址 0xB0F0 的列表内容变为 [1, 2, 3]# 栈中 lst 仍然指向 0xB0F0没变6.总结对比表记忆口诀栈存标签堆存实物变量是标签不是盒子修改可变对象标签不动修改不可变对象标签换贴新实物这个理解是 Python 内存管理的基石掌握后对理解引用传递、深拷贝/浅拷贝、垃圾回收等问题会轻松很多