不像大多数编译型语言,变量必须在使用之前声明名字和类型,在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. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

  2. vim中添加多行注释和删除多行注释

    1.多行注释:   a. 按下Ctrl + v,进入列模式;   b. 在行首选择需要注释的行;   c. 按下"I",进入插入模式:  d. 然后输入注释符("//&q ...

  3. Openmeetings 3.1.1 报错-Internal error

    安装手册官网教程:安装:我按照文档安装了至少10次,都是在初始化数据库时出现了如下:Internal error (图已失效) 后面找了N多资料都没有解决问题直到联Installation OpenM ...

  4. MySQL 使用笔记(一) 关联

    2016-12-16 一.当前未掌握总结: 目前MySQL中不会的内容: 1.临时表(变量表) 2.存储过程 3.游标 4.函数 二.关联 内联.左关联.右关联.外联 (一).标准sql语句中的关联及 ...

  5. SpringMVC 拦截器不拦截静态资源的三种处理方式

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...

  6. 如何提高Linux操作系统的安全性 转自https://yq.aliyun.com/articles/24251?spm=5176.100239.blogcont24250.7.CfBYE9

    摘要: Linux系统不论在功能上.价格上或性能上都有很多优点,但作为开放式操作系统,它不可避免地存在一些安全隐患.关于如何解决这些隐患,为应用提供一个安全的操作平台,本文会告诉你一些最基本.最常用, ...

  7. 浅入浅出“服务器推送”之一:Comet简介

    最近有个项目,其中有项需求要从服务器端主动向客户端推送数据,本以为很简单,但在实际做的过程中发现很棘手,并没有想象中的简单.从网上搜索学习,发现主流讲的还是Ajax的长轮询技术或者流技术,websoc ...

  8. net不安装Oracle11g客户端直接使用ODAC

    好处: 1.不安装客户端也能访问服务器上的oracle(假设Application Server与DB Server 分开) 2.不需要安装ODAC 3.不需要配置TnsNames.Ora文件 缺点: ...

  9. ILGenerator.Emit动态 MSIL编程(二)之基础

    public sealed class ColorToArgb { /// <summary> /// 将十六进制转化为AGRB /// </summary> /// < ...

  10. C# dataTable 排序

    DataView dv = ds.DefaultView; dv.Sort = "header asc"; ds = dv.ToTable(); C# dataTable 排序