栈空间和堆空间的介绍:
栈空间与堆空间的主要区别:
1、内存的分配:
栈空间的内存由系统的编译器或解释器自动分配,无需手动干预;
堆空间的内存需要由用户来手动的申请和释放
2、内存大小:
栈空间的空间比堆空间的小,且大小相对固定;
堆空间的内存较大,可以不断地进行动态分配和释放;
3、 存储方式:
栈空间采用”先进后出“,最后进入栈空间的数据最先被处理,最先进入栈空间的最后被处理;
堆空间中数据的存放无序,可以随时进行引用修改
4、存储内容:
栈空间通常存储局部变量,函数参数,函数调用信息等;
堆空间则用于动态分配的内存的存储
python中的存储:
在python中,基本数据类型如数字、字符串等(一般大小不可变,固定长度类型)是直接存储在栈空间中的;复杂对象如列表、集合、对象实例等是在栈空间中存储数据的引用(类似于地址),而实际的数据则存储在堆空间中。
当这些对象被作为参数传递给函数时,它们的引用会被压入栈空间中,函数返回时再从栈空间中弹出这些引用,但实际的对象并没有被复制,仍然存在于堆空间中。
创建List时内存的变化: 当在python中定义一个列表list时,python会现在栈空间中开辟一块空间来存储该变量的引用,该引用指向堆空间的一块动态分配的内存块,该内存块实际的存储了list对象或集合对象。list和set定义后可不断地进行增加元素,是因为它在定义时会分配一块较大地内存池,然后根据其中实际存储元素地变化来进行内存的动态申请和释放
栈空间使用的优点:
栈空间被广泛应用于函数调用和局部变量存储的原因,主要有以下几个方面:
- 快速分配和回收内存:栈空间的大小通常是固定的,由操作系统预先分配好,因此在使用栈空间时,可以快速地分配和回收内存空间,不需要像堆空间那样进行复杂的内存管理。
- 访问速度快:由于栈空间是连续的内存块,访问起来非常快速,而且在 CPU 中已经内置了栈指针,因此对于栈的操作也比较高效。
- 存取方式简单:栈空间只允许在栈顶进行存取操作,因此存取方式非常简单,不需要像堆空间那样进行指针操作等。
- 便于实现递归:由于函数调用过程本质上也是一种递归调用,栈空间可以很方便地实现递归操作,而且由于栈空间的大小固定,可以很好地控制递归的深度和内存的使用。