python中的内存管理
不像大多数编译型语言,变量必须在使用之前声明名字和类型,在python中,变量在第一次被赋值时自动声明。在变量创建时,python解释器会根据语法和右侧的操作数来决定新对象的类型,在对象创建后,一个该对象的引用会被赋值给左侧的变量。对于内存管理的任务,由python解释器操作。
引用计数
python采用引用计数的技术来记录所有使用中的对象各有多少引用,当一个对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。
1.引用计数增加的情况
a = 1
b = a
赋值并不是直接将一个值赋给一个变量,在python中,对象时通过引用传递的。在赋值时,不管这个对象是被新创建的,还是一个已经存在的,都是将该对象的引用(而不是值)赋值给变量。也就是说a,b两个变量名指向同一个对象,通过 id() 可以确定。
可以看到a,b指向同一个地址。对象被创建并赋值给变量时,该对象的引用计数被设置为1。当同一个对象的引用增加时引用计数会随着增加1,我们通过使用sys包中的getrefcount()函数来查看某个对象的引用计数,(调用getrefcount()时对象回创建一个新的引用,所以返回的值应该比原有的多1)。
对象引用计数增加的情况:
- 对象被创建:x = 1
- 对象另外的别名被创建:y = x
- 被作为参数传递给函数(新的本地引用):func(x)
- 成为容器对象的一个元素:l = [1,2,x]
2、引用计数减少的情况
当对象的引用被销毁时,它的引用计数会自动减1;
- 一个本地引用离开了起作用范围。比如函数结束时
- 对象的别名被显式销毁:del x
- 对象的一个别名被赋值给其他对象:x = 123
- 对象被从一个容器对象中移除:l.remove(x)
- 容器本身被销毁:del l
垃圾收集
不再使用的内存会被一种成为垃圾收集的机制释放。解释器跟踪对象的引用计数,垃圾收集器负责释放内存。垃圾收集器是一块独立代码,它用来寻找计数为0的对象,但也负责检查那些引用计数大于0但应该被销毁的对象。特定情形会导致循环引用。
python垃圾处理机制仅靠引用计数和垃圾收集器是不够的,真正的要复杂的多,学了再更新。
更详细的介绍:http://www.cnblogs.com/vamei/p/3232088.html
python中的内存管理的更多相关文章
- Python 中的内存管理
Python 中一切皆对象,这些对象的内存都是在运行时动态地在堆中进行分配的,就连 Python 虚拟机使用的栈也是在堆上模拟的.既然一切皆对象,那么在 Python 程序运行过程中对象的创建和释放就 ...
- Python中的内存管理机制
Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自 ...
- Python变量与内存管理
Python变量与内存管理 –与C语言中的变量做对比,更好的理解Python的变量. 变量 变量在C语言中 全局变量:其存放在内存的静态变量区中. 局部变量:代码块中存放在内存的代码区当中,当被调 ...
- Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
- C++中的内存管理
在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...
- cocos2dx中的内存管理机制及引用计数
1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...
- Cocos2d-x开发中C++内存管理
由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...
- 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
一 QT的内存管理 1 QT中的内存管理是QObject来管理的 2 QT中的内存管理没有cocos2dx中的引用计数 3 组件能够指定父对象 QTimer *timer = QTime ...
- C语言中的内存管理
开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...
随机推荐
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- 常用Web Service汇总(天气预报、时刻表等)
现成的Web Service中有很多很好用的,比如天气预报,IP地址搜索,火车时刻表等等.本文汇总的一些常用Web Service,希望对大家有所帮助. AD: ================= ...
- 14、java中的equals()和toString()方法
/* 所有对象的父类Object Object中的方法: equals() 对象是否相同的比较方法 toString()对象的字符串表现形式 */ class Person { String name ...
- Debian MySQL 卸载和安装 PHP安装
如果是apt-get安装的 sudo apt-get --purge remove mysql-serversudo apt-get --purge remove mysql-clientsudo a ...
- day26、面向对象进阶:多态、封装、反射
一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...
- WCF服务客户端首页调用慢的问题处理
场景: WCF服务架设于IIS服务中,走TCP协议.客户端首次调用特别慢,第一次加载完后,都正常. 解决: 把服务中需要序列化的模型所在的工程 > 属性 > 生成 > 生成序列化程序 ...
- WindowsForm--Bubble User Control
创建一个自定义用户控件,拖入一个label:lblWords,和一个richTextBox:txtWords 代码: using System; using System.Collections.Ge ...
- OpenCV配置经历简述
关于OpenCV的配置过程在这里做一简述和记录. 配置的是OpenCV2.2.0,环境为VS2010. 首先在OpenCV官网(http://opencv.org/downloads.html)下载了 ...
- inux grep 命令 搜索含有"zynq"字符的文件
使用命令grep -rl 'zynq' /work/xilinx/u-boot-xlnx-master (有引号)-r 选项表示递归(recursive)遍历所有子目录-l 选项表示只列出文件名 /w ...
- sql里面的分页
SELECT TOP 5 * FROM hos_house WHERE HMID NOT IN( SELECT TOP 5 HMID FROM hos_house WHERE PRICE>250 ...