https://blog.csdn.net/qq_41065770/article/details/104623012
内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。
内存空间在逻辑上分为三部分:
代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
**
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级
调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系
统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。(**在堆中Python会为其分配具体的内存空间,此地址即为此对象在内存中的地址**)
引用位于栈, 对象位于堆

需要注意的是在Python中会为匿名列表对象和匿名字典对象以及短字符串创建缓存区,并且Python自带小对象整数池(-5~256)**
1. 针对匿名列表和字典对象(即不存在变量名的引用)
列表和字典这种可变对象当为匿名对象是会向外暴露一个内存地址,不论里面的内容怎么变,该地址不变,所以下面的地址都一样
id([1,2,3]) == id([4,5,6]) # Trueid([1])==id([1,2,3,4,5,6]) # Trueid({1:1,2:2})==id({3:3,4:4}) # True'''但是如果存在对象的引用,即非匿名对象,上面的结果都是False,如下'''a=[1,2,3];b=[4,5,6];c={1:1,2:};d={3:3,4:4}id(a)==id(b) # Fasleid(c)==id(d) # Fasle
2. 针对短字符串
Python会为短字符串创建内存缓存,即针对相同的短字符串,只会创建一个内存空间,不会为相同的短字符串创建多个内存空间,但是长字符串不会如此,如下面的例子:**
3. 针对小整数
Python会为(-5,256)之间的整数分配独立的内存空间,当有对象调用的时候会直接从里面取地址,不论调用多少次,都不会再为这些对象创建新的内存空间
4. 针对元组

本文例子全部在在Python命令行模式下执行,在PyCharm中进行执行可能会有些许不同,因为PyCharm软件自带对变量和对象的一种“优化管理”,不是真正的Python的内存管理效果
