Python 中的内存分配关系(变量,列表,元祖等) |
您所在的位置:网站首页 › python如何查看变量在内存中的地址信息表中的数据大小 › Python 中的内存分配关系(变量,列表,元祖等) |
文章目录
一、Python 的内存管理模式二、元组和列表的内存分配机制三、copy 和分片
一、Python 的内存管理模式
Python采用基于值的内存管理模式,相同的值在内存中只有一份 首先明确一点,整数、实数、字符串是真正意义上的值,而上面那句话中的“值”主要指整数和短字符串 对于列表、元组、字典、集合以及range对象、map对象等容器类对象,它们不是普通的“值”,即使看起来是一样的,在内存中也不会只保存一份。 每次有新的对象引用该对象,其计数器加1,每次使用del释放一个引用,其计数器减1,如果垃圾回收机制发现某对象的引用次数为0,则将其删除。 对于 [-5,256] 之间的整数,系统会进行缓存,因为系统本身也有大量对象在引用这些值 把整数或者字符串放在列表或者元祖中,也只会保存一份 List:动态数组,元素可变,可改变大小(append,pop 等) Tuple:静态数组,不可变,数据一旦创建后不可改变 (1) List 的内存利用 当创建N个元素的List时,Python的动态内存分配长N+1个元素的内存,第一个元素存储列表长度,和列表的元信息 当Append一个元素时,Python将创建一个足够大的列表,来容纳N个元素和将要被追加的元素。重新创建的列表长度大于N+1(虽然我们只触发一次append操作),实际上,为了未来的Append操作,M个元素长度(M>N+1)的内存将会被额外分配,然后,旧列表中的数据被copy到新列表中,旧列表销毁。 额外内存的分配,只会发生在第一次Append操作时,当我们创建普通列表时,不会额外分配内存 这里的哲学是,一个Append操作很可能是很多Append操作的开始,通过额外分配内存来减少可能的内存分配和内存copy的次数。 补充: python 采用的是分离式结构动态数组的方法 用户持续添加列表元素时,动态数组预留的空间迟早会被耗尽,列表类会向系统请求一个新的,更大的内存空间,并初始化该数组,旧的数组将会被系统收回 因为存储的只是引用地址,地址重新指向了新分配的数组,所以 列表的 id 不会发生变化 可以自己写个循环,不断append,尝试下 import sys list,num =[],0 while num |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |