- python是动态类型,对象是用于存储数据。在python中,各种数字,字符串,列表,字典都是对象,相当于java的变量
- 引用,python程序中写的对象名,指向对象
- 引用和对象分离,是动态类型的核心
Python是怎样管理内存
Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为Python的heap空间分配内存是由Python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。Python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。
a= 3 #a是引用,指向对象3. 3是存储内存中的一个整数对象
引用计数
x=3.14
y=x
如图,内存创建一个浮点型对象-3.14,然后将引用x指向于对象3.14,对象3.14的引用计数就是1,语句y=x,则是创建了一个指向同一个对象的引用别名y,同时对象3.14的引用计数就是2.
x=3.14
y=x
x=4
y=5
上面的对象3.14的引用计数是0,会被清空
python内存池机制
第0层是C中的malloc,free等内存分配和释放函数进行操作;
第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;
第3层是最上层,也就是我们对Python对象的直接操作;
在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:
如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.
经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同
python 垃圾回收机制
python的垃圾回收以引用计数为主,标记-清除和分代收集为辅。print gc.collect()可以看到python的垃圾
python中到底是“传引用”还是“传值”呢
python中根据对象的可变性来取决于“传引用”还是“传值”。对象的可变性取决于对象类型
- 基本类型(整型),字符串、元组 属于不可变对象
- 列表、字典、类以及类的实例 属于可变对象
本文引用:
http://www.cnblogs.com/CBDoctor/p/3781078.html
//www.greatytc.com/p/6226016cb327