不像大多数编译型语言,变量必须在使用之前声明名字和类型,在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中的内存管理的更多相关文章

  1. Python 中的内存管理

    Python 中一切皆对象,这些对象的内存都是在运行时动态地在堆中进行分配的,就连 Python 虚拟机使用的栈也是在堆上模拟的.既然一切皆对象,那么在 Python 程序运行过程中对象的创建和释放就 ...

  2. Python中的内存管理机制

    Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自 ...

  3. Python变量与内存管理

    Python变量与内存管理 –与C语言中的变量做对比,更好的理解Python的变量. 变量 变量在C语言中  全局变量:其存放在内存的静态变量区中.  局部变量:代码块中存放在内存的代码区当中,当被调 ...

  4. Unity游戏开发中的内存管理_资料

    内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...

  5. C++中的内存管理

    在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...

  6. cocos2dx中的内存管理机制及引用计数

    1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...

  7. Cocos2d-x开发中C++内存管理

    由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...

  8. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件能够指定父对象 QTimer *timer = QTime ...

  9. C语言中的内存管理

    开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...

随机推荐

  1. linux下安装安装pcre-8.32

    linux下安装安装pcre-8.32 ./configure --prefix=/usr/local/pcre 出现以下错误 configure: error: You need a C++ com ...

  2. 解释器模式(Interpreter Pattern)

    定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...

  3. halcon运行版设置

  4. easycwmp的交叉编译

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  5. u-boot-2010.09移植(B)

    前面我们的u-boot只是在内存中运行,要想在nandflash中运行,以达到开机自启的目的,还需作如下修改 一.添加DM9000网卡支持 1.修改board/fl2440/fl2440.c中的boa ...

  6. php lock_sh共享锁 与 lock_ex排他锁

    参考网站:http://hi.baidu.com/honly1215/item/8d27a66d11689c3aac3e83fe 文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LO ...

  7. shell脚本,防止sshd被暴力破解

    1.tail -f /var/log/secure 你会发现有很多的登录 错误.这说明你的机器正在被暴力破解. 2.新建 一个 shell脚 本 保存退出. 3.加入定时crontab -e 我这里每 ...

  8. Rails :布局和视图渲染

    原文地址: http://guides.ruby-china.org/layouts_and_rendering.html Rails 布局和视图渲染 本文介绍 Action Controller 和 ...

  9. My Interface

    一.创建Myinterface接口 public interface Myinterface { static final String MyifName="我的接口"; stat ...

  10. 转贴:让Windows 2008 R2 64bit支持ASP.NET 1.1应用程序

    随着 Windows Server 2003 的支持期限到期, 最近有很多企业将目前很多的 Windows Server 2003 升级到 Windows 2008 R2. 之前有许多 Web App ...