Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为Python的heap空间分配内存是由Python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。Python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。
一、垃圾回收:
Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型语言可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。
二、引用计数:
Python采用了类似windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对象就会被回收。
三、内存池机制
Python的内存机制成金字塔形:
第-1,-2层主要有操作系统进行操作;
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256字节时由该层直接分配内存;
第三层是最上层,也就是我们对Python对象的直接操作;
在C中如果频繁的调用malloc与free时,是会产生性能问题的,在加上频繁的分配和释放小块的内存会产生内存碎片。
Python在这里主要干的工作有:
如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用malloc。
这里还是会调用malloc分配内存,但每次回分配一块大小为256字节的大块内存。
经由内存池登记的内存到最后还是会回收到内存池,并不会调用C的free释放掉,以便下次使用。对于简单的Python对象,例如数值、字符串、元组(tuple不允许被更改)采用的是复制的方式(深拷贝),也就是说当讲另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但是当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同。
变量本质
Python变量本质
o 变量不需先定义在使用,我们可以直接给变量名赋值,直接使用
>>> a = 1 #这里我们可以直接给a变量赋值为1,并没有提前对a进行声明
o 变量可以重复存储不同种数据类型
>>> a = 1
>>> a = 'abc' #对a重复复制并不会导致报错
________________________________________
o 可以同时为多个变量赋值
>>> a, b = 1, 2
>>> a
>>> b
_______